summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-05-05 11:38:27 +0200
committerKonstantin Käfer <mail@kkaefer.com>2015-05-05 11:53:20 +0200
commit24083c582c7308025ed05285ad9e82696c70658a (patch)
treebd77e509ea403eafe2e604eff4d18f246fd165aa
parent691c305467c5d503719743e69f73bf28f20894d5 (diff)
downloadqtlocation-mapboxgl-24083c582c7308025ed05285ad9e82696c70658a.tar.gz
[iOS] add benchmarking application
-rw-r--r--.gitignore4
-rw-r--r--Makefile6
-rw-r--r--gyp/ios.gyp1
-rw-r--r--ios/benchmark/MBXBenchAppDelegate.h7
-rw-r--r--ios/benchmark/MBXBenchAppDelegate.m15
-rw-r--r--ios/benchmark/MBXBenchViewController.h5
-rw-r--r--ios/benchmark/MBXBenchViewController.mm140
-rw-r--r--ios/benchmark/app-info.plist51
-rwxr-xr-xios/benchmark/assets/glyphs/download.sh30
-rw-r--r--ios/benchmark/assets/sprites/mapbox-streets.json2034
-rw-r--r--ios/benchmark/assets/sprites/mapbox-streets.pngbin0 -> 81643 bytes
-rw-r--r--ios/benchmark/assets/sprites/mapbox-streets@2x.json2034
-rw-r--r--ios/benchmark/assets/sprites/mapbox-streets@2x.pngbin0 -> 192103 bytes
-rw-r--r--ios/benchmark/assets/styles/mapbox-streets-v7.json3917
-rwxr-xr-xios/benchmark/assets/tiles/download.sh175
-rw-r--r--ios/benchmark/assets/tiles/mapbox.mapbox-streets-v6.json1
-rw-r--r--ios/benchmark/assets/tiles/mapbox.mapbox-terrain-v2.json1
-rw-r--r--ios/benchmark/benchmark-ios.gypi63
-rw-r--r--ios/benchmark/fo/MBXBenchViewController.mm140
-rw-r--r--ios/benchmark/fo/benchmark-ios.gypi64
-rw-r--r--ios/benchmark/img/Icon-40.pngbin0 -> 1295 bytes
-rw-r--r--ios/benchmark/img/Icon-40@2x.pngbin0 -> 2971 bytes
-rw-r--r--ios/benchmark/img/Icon-40@3x.pngbin0 -> 5936 bytes
-rw-r--r--ios/benchmark/img/Icon-60.pngbin0 -> 2051 bytes
-rw-r--r--ios/benchmark/img/Icon-60@2x.pngbin0 -> 5936 bytes
-rw-r--r--ios/benchmark/img/Icon-60@3x.pngbin0 -> 11806 bytes
-rw-r--r--ios/benchmark/img/Icon-72.pngbin0 -> 2610 bytes
-rw-r--r--ios/benchmark/img/Icon-72@2x.pngbin0 -> 7894 bytes
-rw-r--r--ios/benchmark/img/Icon-76.pngbin0 -> 2841 bytes
-rw-r--r--ios/benchmark/img/Icon-76@2x.pngbin0 -> 8633 bytes
-rw-r--r--ios/benchmark/img/Icon-Small-50.pngbin0 -> 1676 bytes
-rw-r--r--ios/benchmark/img/Icon-Small-50@2x.pngbin0 -> 4490 bytes
-rw-r--r--ios/benchmark/img/Icon-Small.pngbin0 -> 1009 bytes
-rw-r--r--ios/benchmark/img/Icon-Small@2x.pngbin0 -> 2046 bytes
-rw-r--r--ios/benchmark/img/Icon-Small@3x.pngbin0 -> 3371 bytes
-rw-r--r--ios/benchmark/img/Icon.pngbin0 -> 2009 bytes
-rw-r--r--ios/benchmark/img/Icon.svg6
-rw-r--r--ios/benchmark/img/Icon@2x.pngbin0 -> 5436 bytes
-rw-r--r--ios/benchmark/img/iTunesArtwork.pngbin0 -> 113442 bytes
-rw-r--r--ios/benchmark/img/iTunesArtwork@2x.pngbin0 -> 399202 bytes
-rw-r--r--ios/benchmark/locations.cpp18
-rw-r--r--ios/benchmark/locations.hpp23
-rw-r--r--ios/benchmark/main.m10
-rwxr-xr-xscripts/ios/benchmark.sh16
44 files changed, 8760 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 833025085a..fa3937dd28 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,7 @@
/src/shader/shaders_gles2.cpp
/bin/style.bin.js
*~
+
+/ios/benchmark/assets/tiles/mapbox.mapbox-streets-v6/
+/ios/benchmark/assets/tiles/mapbox.mapbox-terrain-v2/
+/ios/benchmark/assets/glyphs/DIN Offc Pro*/
diff --git a/Makefile b/Makefile
index 3a2bd75c5f..0836bbc65c 100644
--- a/Makefile
+++ b/Makefile
@@ -120,7 +120,11 @@ ios-proj: Xcode/ios
ios: XCPRETTY := $(shell ./scripts/xcpretty.sh)
ios: Xcode/ios
- xcodebuild -sdk iphoneos ARCHS="arm64 armv7 armv7s" PROVISIONING_PROFILE="2b532944-bf3d-4bf4-aa6c-a81676984ae8" -project ./build/ios/gyp/ios.xcodeproj -configuration Release -target iosapp -jobs $(JOBS) $(XCPRETTY)
+ xcodebuild -sdk iphoneos ARCHS="arm64 armv7 armv7s" PROVISIONING_PROFILE="19324a54-7455-4f0b-8e1c-e6957c718ebc" -project ./build/ios/gyp/ios.xcodeproj -configuration Release -target iosapp -jobs $(JOBS) $(XCPRETTY)
+
+ibench: XCPRETTY := $(shell ./scripts/xcpretty.sh)
+ibench: Xcode/ios
+ xcodebuild -sdk iphoneos ARCHS="arm64" PROVISIONING_PROFILE="19324a54-7455-4f0b-8e1c-e6957c718ebc" -project ./build/ios/gyp/ios.xcodeproj -configuration Release -target ios-bench -jobs $(JOBS) $(XCPRETTY)
isim: XCPRETTY := $(shell ./scripts/xcpretty.sh)
isim: Xcode/ios
diff --git a/gyp/ios.gyp b/gyp/ios.gyp
index 989f34cb72..f26ec3772c 100644
--- a/gyp/ios.gyp
+++ b/gyp/ios.gyp
@@ -1,5 +1,6 @@
{
'includes': [
'../ios/app/mapboxgl-app.gypi',
+ '../ios/benchmark/benchmark-ios.gypi',
],
}
diff --git a/ios/benchmark/MBXBenchAppDelegate.h b/ios/benchmark/MBXBenchAppDelegate.h
new file mode 100644
index 0000000000..b8f6c2e641
--- /dev/null
+++ b/ios/benchmark/MBXBenchAppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface MBXBenchAppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end \ No newline at end of file
diff --git a/ios/benchmark/MBXBenchAppDelegate.m b/ios/benchmark/MBXBenchAppDelegate.m
new file mode 100644
index 0000000000..e8fbd88d28
--- /dev/null
+++ b/ios/benchmark/MBXBenchAppDelegate.m
@@ -0,0 +1,15 @@
+#import "MBXBenchAppDelegate.h"
+#import "MBXBenchViewController.h"
+
+@implementation MBXBenchAppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+ self.window.rootViewController = [MBXBenchViewController new];
+ [self.window makeKeyAndVisible];
+
+ return YES;
+}
+
+@end
diff --git a/ios/benchmark/MBXBenchViewController.h b/ios/benchmark/MBXBenchViewController.h
new file mode 100644
index 0000000000..c4439be5ec
--- /dev/null
+++ b/ios/benchmark/MBXBenchViewController.h
@@ -0,0 +1,5 @@
+#import <UIKit/UIKit.h>
+
+@interface MBXBenchViewController : UIViewController
+
+@end
diff --git a/ios/benchmark/MBXBenchViewController.mm b/ios/benchmark/MBXBenchViewController.mm
new file mode 100644
index 0000000000..0ac6675276
--- /dev/null
+++ b/ios/benchmark/MBXBenchViewController.mm
@@ -0,0 +1,140 @@
+#import "MBXBenchViewController.h"
+
+#import <mbgl/ios/MGLMapView.h>
+#import <mbgl/ios/MGLMapView_Private.h>
+
+#include "locations.hpp"
+
+#include <chrono>
+
+@interface MBXBenchViewController () <MGLMapViewDelegate>
+
+@property (nonatomic) MGLMapView *mapView;
+
+@end
+
+@implementation MBXBenchViewController
+
+#pragma mark - Setup
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ NSURL* url = [[NSURL alloc] initWithString:@"asset://styles/mapbox-streets-v7.json"];
+ self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds accessToken:nil styleURL:url];
+ self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ self.mapView.delegate = self;
+ self.mapView.zoomEnabled = NO;
+ self.mapView.scrollEnabled = NO;
+ self.mapView.rotateEnabled = NO;
+ self.mapView.userInteractionEnabled = YES;
+ [self.mapView setDebugActive:NO];
+
+ [self startBenchmarkIteration];
+
+ [self.view addSubview:self.mapView];
+
+}
+
+using Clock = std::chrono::steady_clock;
+using TimePoint = Clock::time_point;
+template <typename Duration>
+inline int64_t Microseconds(Duration d) {
+ return std::chrono::duration_cast<std::chrono::microseconds>(d).count();
+}
+
+size_t idx = 0;
+enum class State { None, WaitingForAssets, WarmingUp, Benchmarking } state = State::None;
+int frames = 0;
+TimePoint started;
+std::vector<std::pair<std::string, double>> result;
+
+static const int warmupDuration = 20; // frames
+static const int benchmarkDuration = 200; // frames
+
+- (void)startBenchmarkIteration
+{
+ if (mbgl::bench::locations.size() > idx) {
+ const auto& location = mbgl::bench::locations[idx];
+ [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(location.latitude, location.longitude) zoomLevel:location.zoom animated:NO];
+ self.mapView.direction = location.bearing;
+ state = State::WaitingForAssets;
+ NSLog(@"Benchmarking \"%s\"", location.name.c_str());
+ NSLog(@"- Loading assets...");
+ } else {
+ // Do nothing. The benchmark is completed.
+ NSLog(@"Benchmark completed.");
+ NSLog(@"Result:");
+ size_t colWidth = 0;
+ for (const auto& row : result) {
+ colWidth = std::max(row.first.size(), colWidth);
+ }
+ for (const auto& row : result) {
+ NSLog(@"| %-*s | %4.1f fps |", int(colWidth), row.first.c_str(), row.second);
+ }
+ exit(0);
+ }
+}
+
+- (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered
+{
+ (void)mapView;
+ (void)fullyRendered;
+
+ if (state == State::Benchmarking)
+ {
+ frames++;
+ if (frames >= benchmarkDuration)
+ {
+ state = State::None;
+
+ // Report FPS
+ const auto duration = Microseconds(Clock::now() - started);
+ const auto fps = double(frames * 1e6) / duration;
+ result.emplace_back(mbgl::bench::locations[idx].name, fps);
+ NSLog(@"- FPS: %.1f", fps);
+
+ // Start benchmarking the next location.
+ idx++;
+ [self startBenchmarkIteration];
+ } else {
+ [mapView invalidate];
+ }
+ return;
+ }
+
+ else if (state == State::WarmingUp)
+ {
+ frames++;
+ if (frames >= warmupDuration)
+ {
+ frames = 0;
+ state = State::Benchmarking;
+ started = Clock::now();
+ NSLog(@"- Benchmarking for %d frames...", benchmarkDuration);
+ }
+ [mapView invalidate];
+ return;
+ }
+
+ else if (state == State::WaitingForAssets)
+ {
+ if ([mapView isFullyLoaded])
+ {
+ // Start the benchmarking timer.
+ state = State::WarmingUp;
+ [self.mapView emptyMemoryCache];
+ NSLog(@"- Warming up for %d frames...", warmupDuration);
+ [mapView invalidate];
+ }
+ return;
+ }
+}
+
+- (NSUInteger)supportedInterfaceOrientations
+{
+ return UIInterfaceOrientationMaskLandscape;
+}
+
+@end
diff --git a/ios/benchmark/app-info.plist b/ios/benchmark/app-info.plist
new file mode 100644
index 0000000000..fe29fce2c1
--- /dev/null
+++ b/ios/benchmark/app-info.plist
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.mapbox.GL.benchmark</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>0.0.2</string>
+ <key>CFBundleSignature</key>
+ <string>MBGL</string>
+ <key>CFBundleVersion</key>
+ <string>0.0.3</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>(c) 2015 Mapbox</string>
+ <key>UIApplicationExitsOnSuspend</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>Default</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/ios/benchmark/assets/glyphs/download.sh b/ios/benchmark/assets/glyphs/download.sh
new file mode 100755
index 0000000000..0ac1513827
--- /dev/null
+++ b/ios/benchmark/assets/glyphs/download.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+
+set -u
+
+LIST=(
+ "DIN%20Offc%20Pro%20Regular%2c%20Arial%20Unicode%20MS%20Regular/0-255.pbf"
+ "DIN%20Offc%20Pro%20Medium%2c%20Arial%20Unicode%20MS%20Bold/0-255.pbf"
+ "DIN%20Offc%20Pro%20Medium%2c%20Arial%20Unicode%20MS%20Regular/0-255.pbf"
+ "DIN%20Offc%20Pro%20Medium%2c%20Arial%20Unicode%20MS%20Regular/8192-8447.pbf"
+ "DIN%20Offc%20Pro%20Bold%2c%20Arial%20Unicode%20MS%20Regular/0-255.pbf"
+ "DIN%20Offc%20Pro%20Regular%2c%20Arial%20Unicode%20MS%20Regular/256-511.pbf"
+ "DIN%20Offc%20Pro%20Regular%2c%20Arial%20Unicode%20MS%20Regular/8192-8447.pbf"
+ "DIN%20Offc%20Pro%20Italic%2c%20Arial%20Unicode%20MS%20Regular/0-255.pbf"
+ "DIN%20Offc%20Pro%20Medium%2c%20Arial%20Unicode%20MS%20Regular/256-511.pbf"
+)
+
+# from https://gist.github.com/cdown/1163649
+urldecode() {
+ local url_encoded="${1//+/ }"
+ printf '%b' "${url_encoded//%/\x}"
+}
+
+for i in ${LIST[@]} ; do
+ OUTPUT=`urldecode "$i"`
+ if [ ! -f "${OUTPUT}" ] ; then
+ mkdir -p "`dirname "${OUTPUT}"`"
+ echo "Downloading glyph '${OUTPUT}'"
+ curl -# "https://api.tiles.mapbox.com/v4/fontstack/${i}?access_token=${MAPBOX_ACCESS_TOKEN}" | gunzip > "${OUTPUT}"
+ fi
+done
diff --git a/ios/benchmark/assets/sprites/mapbox-streets.json b/ios/benchmark/assets/sprites/mapbox-streets.json
new file mode 100644
index 0000000000..488bf335de
--- /dev/null
+++ b/ios/benchmark/assets/sprites/mapbox-streets.json
@@ -0,0 +1,2034 @@
+{
+ "secondary_marker": {
+ "x": 0,
+ "y": 0,
+ "width": 20,
+ "height": 50,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default_marker": {
+ "x": 22,
+ "y": 0,
+ "width": 20,
+ "height": 50,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-alternate-1-large": {
+ "x": 44,
+ "y": 0,
+ "width": 21,
+ "height": 37,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-business-1-large": {
+ "x": 67,
+ "y": 0,
+ "width": 27,
+ "height": 37,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-business-2-large": {
+ "x": 0,
+ "y": 52,
+ "width": 27,
+ "height": 37,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-alternate-2-large": {
+ "x": 29,
+ "y": 52,
+ "width": 27,
+ "height": 37,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-truck-1-large": {
+ "x": 58,
+ "y": 52,
+ "width": 23,
+ "height": 35,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-truck-2-large": {
+ "x": 96,
+ "y": 0,
+ "width": 27,
+ "height": 35,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "marsh-32": {
+ "x": 0,
+ "y": 91,
+ "width": 32,
+ "height": 32,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-alternate-1-small": {
+ "x": 96,
+ "y": 37,
+ "width": 17,
+ "height": 31,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-business-1-small": {
+ "x": 34,
+ "y": 91,
+ "width": 17,
+ "height": 31,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-alternate-2-small": {
+ "x": 53,
+ "y": 91,
+ "width": 21,
+ "height": 31,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-truck-2-small": {
+ "x": 76,
+ "y": 91,
+ "width": 21,
+ "height": 31,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-business-2-small": {
+ "x": 99,
+ "y": 91,
+ "width": 21,
+ "height": 31,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-truck-1-small": {
+ "x": 125,
+ "y": 0,
+ "width": 17,
+ "height": 31,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-duplex-4-large": {
+ "x": 144,
+ "y": 0,
+ "width": 40,
+ "height": 29,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-duplex-3-large": {
+ "x": 144,
+ "y": 31,
+ "width": 35,
+ "height": 29,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-2-large": {
+ "x": 144,
+ "y": 62,
+ "width": 29,
+ "height": 29,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-duplex-5-large": {
+ "x": 0,
+ "y": 125,
+ "width": 43,
+ "height": 29,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-3-large": {
+ "x": 144,
+ "y": 93,
+ "width": 35,
+ "height": 29,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-1-large": {
+ "x": 45,
+ "y": 125,
+ "width": 25,
+ "height": 29,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-business-3-large": {
+ "x": 72,
+ "y": 125,
+ "width": 35,
+ "height": 28,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-business-2-large": {
+ "x": 109,
+ "y": 125,
+ "width": 29,
+ "height": 28,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-business-1-large": {
+ "x": 140,
+ "y": 125,
+ "width": 25,
+ "height": 28,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-2-large": {
+ "x": 0,
+ "y": 156,
+ "width": 25,
+ "height": 26,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-4-large": {
+ "x": 27,
+ "y": 156,
+ "width": 37,
+ "height": 26,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-1-large": {
+ "x": 66,
+ "y": 156,
+ "width": 20,
+ "height": 26,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-3-large": {
+ "x": 88,
+ "y": 156,
+ "width": 30,
+ "height": 26,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-3-large": {
+ "x": 120,
+ "y": 156,
+ "width": 31,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-4-large": {
+ "x": 186,
+ "y": 0,
+ "width": 36,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-3-small": {
+ "x": 186,
+ "y": 27,
+ "width": 30,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-2-small": {
+ "x": 186,
+ "y": 54,
+ "width": 25,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-1-small": {
+ "x": 186,
+ "y": 81,
+ "width": 21,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-duplex-5-small": {
+ "x": 186,
+ "y": 108,
+ "width": 36,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-duplex-4-small": {
+ "x": 186,
+ "y": 135,
+ "width": 34,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-duplex-3-small": {
+ "x": 153,
+ "y": 156,
+ "width": 30,
+ "height": 25,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-business-2-small": {
+ "x": 0,
+ "y": 184,
+ "width": 25,
+ "height": 24,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-business-3-small": {
+ "x": 27,
+ "y": 184,
+ "width": 30,
+ "height": 24,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-interstate-business-1-small": {
+ "x": 59,
+ "y": 184,
+ "width": 21,
+ "height": 24,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-1-large": {
+ "x": 82,
+ "y": 184,
+ "width": 20,
+ "height": 24,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-2-large": {
+ "x": 104,
+ "y": 184,
+ "width": 25,
+ "height": 24,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "post-15": {
+ "x": 131,
+ "y": 184,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "prison-15": {
+ "x": 156,
+ "y": 184,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "religious-christian-15": {
+ "x": 181,
+ "y": 184,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "religious-jewish-15": {
+ "x": 224,
+ "y": 0,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "religious-muslim-15": {
+ "x": 224,
+ "y": 25,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rocket-15": {
+ "x": 224,
+ "y": 50,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "shop-15": {
+ "x": 224,
+ "y": 75,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "star-15": {
+ "x": 224,
+ "y": 100,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "suitcase-15": {
+ "x": 224,
+ "y": 125,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "swimming-15": {
+ "x": 224,
+ "y": 150,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "theatre-15": {
+ "x": 224,
+ "y": 175,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "town-hall-15": {
+ "x": 0,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "triangle-15": {
+ "x": 25,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "triangle-stroked-15": {
+ "x": 50,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dentist-15": {
+ "x": 75,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "hospital-15": {
+ "x": 100,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "pharmacy-15": {
+ "x": 125,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "america-football-15": {
+ "x": 150,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "baseball-15": {
+ "x": 175,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "basketball-15": {
+ "x": 200,
+ "y": 210,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "campsite-15": {
+ "x": 249,
+ "y": 0,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "cemetery-15": {
+ "x": 249,
+ "y": 25,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dog-park-15": {
+ "x": 249,
+ "y": 50,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "beer-15": {
+ "x": 249,
+ "y": 75,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "park-15": {
+ "x": 249,
+ "y": 100,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bar-15": {
+ "x": 249,
+ "y": 125,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "playground-15": {
+ "x": 249,
+ "y": 150,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "zoo-15": {
+ "x": 249,
+ "y": 175,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "college-15": {
+ "x": 249,
+ "y": 200,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "ferry-15": {
+ "x": 0,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "school-15": {
+ "x": 25,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rail-metro-15": {
+ "x": 50,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "cafe-15": {
+ "x": 75,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bus-15": {
+ "x": 100,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "airport-15": {
+ "x": 125,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "airfield-15": {
+ "x": 150,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "fast-food-15": {
+ "x": 175,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rail-light-15": {
+ "x": 200,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rail-15": {
+ "x": 225,
+ "y": 235,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "heliport-15": {
+ "x": 274,
+ "y": 0,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "restaurant-15": {
+ "x": 274,
+ "y": 25,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "alcohol-shop-15": {
+ "x": 274,
+ "y": 50,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "art-gallery-15": {
+ "x": 274,
+ "y": 75,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bakery-15": {
+ "x": 274,
+ "y": 100,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bank-15": {
+ "x": 274,
+ "y": 125,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bicycle-15": {
+ "x": 274,
+ "y": 150,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "car-15": {
+ "x": 274,
+ "y": 175,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "cinema-15": {
+ "x": 274,
+ "y": 200,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "circle-15": {
+ "x": 274,
+ "y": 225,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "circle-stroked-15": {
+ "x": 0,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "clothing-store-15": {
+ "x": 25,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "embassy-15": {
+ "x": 50,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "fire-station-15": {
+ "x": 75,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "fuel-15": {
+ "x": 100,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "garden-15": {
+ "x": 125,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "grocery-15": {
+ "x": 150,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "hairdresser-15": {
+ "x": 175,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "harbor-15": {
+ "x": 200,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "ice-cream-15": {
+ "x": 225,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "laundry-15": {
+ "x": 250,
+ "y": 260,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "library-15": {
+ "x": 299,
+ "y": 0,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "lodging-15": {
+ "x": 299,
+ "y": 25,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "marker-15": {
+ "x": 299,
+ "y": 50,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "monument-15": {
+ "x": 299,
+ "y": 75,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "museum-15": {
+ "x": 299,
+ "y": 100,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "music-15": {
+ "x": 299,
+ "y": 125,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "place-of-worship-15": {
+ "x": 299,
+ "y": 150,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "police-15": {
+ "x": 299,
+ "y": 175,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "golf-15": {
+ "x": 299,
+ "y": 200,
+ "width": 23,
+ "height": 23,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-4-small": {
+ "x": 0,
+ "y": 285,
+ "width": 31,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-1-small": {
+ "x": 299,
+ "y": 225,
+ "width": 17,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-duplex-3-large": {
+ "x": 33,
+ "y": 285,
+ "width": 32,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-2-small": {
+ "x": 299,
+ "y": 249,
+ "width": 21,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-duplex-4-large": {
+ "x": 67,
+ "y": 285,
+ "width": 34,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-federal-3-small": {
+ "x": 103,
+ "y": 285,
+ "width": 25,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-duplex-5-large": {
+ "x": 130,
+ "y": 285,
+ "width": 37,
+ "height": 22,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "washington-metro-11": {
+ "x": 225,
+ "y": 210,
+ "width": 21,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-3-large": {
+ "x": 169,
+ "y": 285,
+ "width": 30,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-2-large": {
+ "x": 201,
+ "y": 285,
+ "width": 27,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "light-11": {
+ "x": 250,
+ "y": 235,
+ "width": 21,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "subway-11": {
+ "x": 275,
+ "y": 260,
+ "width": 21,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-1-large": {
+ "x": 230,
+ "y": 285,
+ "width": 20,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "u-bahn-11": {
+ "x": 252,
+ "y": 285,
+ "width": 21,
+ "height": 21,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-1-small": {
+ "x": 186,
+ "y": 162,
+ "width": 17,
+ "height": 20,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-4-small": {
+ "x": 275,
+ "y": 285,
+ "width": 29,
+ "height": 20,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "mx-state-3-small": {
+ "x": 324,
+ "y": 0,
+ "width": 25,
+ "height": 20,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "circle.sdf": {
+ "x": 324,
+ "y": 22,
+ "width": 19,
+ "height": 20,
+ "pixelRatio": 1,
+ "sdf": true
+ },
+ "mx-state-2-small": {
+ "x": 324,
+ "y": 44,
+ "width": 21,
+ "height": 20,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "zoo-11": {
+ "x": 324,
+ "y": 66,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "beer-11": {
+ "x": 324,
+ "y": 87,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dlr-11": {
+ "x": 324,
+ "y": 108,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dlr.london-overground.london-underground.national-rail-11": {
+ "x": 0,
+ "y": 309,
+ "width": 75,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dlr.london-underground-11": {
+ "x": 77,
+ "y": 309,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dlr.london-underground.national-rail-11": {
+ "x": 118,
+ "y": 309,
+ "width": 57,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dlr.national-rail-11": {
+ "x": 177,
+ "y": 309,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "heliport-11": {
+ "x": 324,
+ "y": 129,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "museum-11": {
+ "x": 324,
+ "y": 150,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "london-overground-11": {
+ "x": 324,
+ "y": 171,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "london-overground.london-underground-11": {
+ "x": 218,
+ "y": 309,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "london-overground.london-underground.national-rail-11": {
+ "x": 259,
+ "y": 309,
+ "width": 57,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "london-overground.national-rail-11": {
+ "x": 0,
+ "y": 330,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "london-underground-11": {
+ "x": 324,
+ "y": 192,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "london-underground.national-rail-11": {
+ "x": 41,
+ "y": 330,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "circle-11": {
+ "x": 324,
+ "y": 213,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "metro.rer-11": {
+ "x": 82,
+ "y": 330,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "moscow-metro-11": {
+ "x": 324,
+ "y": 234,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "national-rail-11": {
+ "x": 324,
+ "y": 255,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rail-11": {
+ "x": 324,
+ "y": 276,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rer-11": {
+ "x": 96,
+ "y": 70,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rer.transilien-11": {
+ "x": 123,
+ "y": 330,
+ "width": 39,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "s-bahn-11": {
+ "x": 318,
+ "y": 309,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "music-11": {
+ "x": 164,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "transilien-11": {
+ "x": 185,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "school-11": {
+ "x": 206,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "place-of-worship-11": {
+ "x": 227,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "weiner-linien-11": {
+ "x": 248,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "ferry-11": {
+ "x": 269,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "circle-stroked-11": {
+ "x": 290,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bus-11": {
+ "x": 311,
+ "y": 330,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "police-11": {
+ "x": 351,
+ "y": 0,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "airport-11": {
+ "x": 351,
+ "y": 21,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "fast-food-11": {
+ "x": 351,
+ "y": 42,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "airfield-11": {
+ "x": 351,
+ "y": 63,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "post-11": {
+ "x": 351,
+ "y": 84,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "clothing-store-11": {
+ "x": 351,
+ "y": 105,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "prison-11": {
+ "x": 351,
+ "y": 126,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "alcohol-shop-11": {
+ "x": 351,
+ "y": 147,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "religious-christian-11": {
+ "x": 351,
+ "y": 168,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "embassy-11": {
+ "x": 351,
+ "y": 189,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "religious-jewish-11": {
+ "x": 351,
+ "y": 210,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bar-11": {
+ "x": 351,
+ "y": 231,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "religious-muslim-11": {
+ "x": 351,
+ "y": 252,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "fire-station-11": {
+ "x": 351,
+ "y": 273,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rocket-11": {
+ "x": 351,
+ "y": 294,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "art-gallery-11": {
+ "x": 351,
+ "y": 315,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "shop-11": {
+ "x": 0,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "fuel-11": {
+ "x": 21,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "star-11": {
+ "x": 42,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "restaurant-11": {
+ "x": 63,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "suitcase-11": {
+ "x": 84,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "garden-11": {
+ "x": 105,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "swimming-11": {
+ "x": 126,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bakery-11": {
+ "x": 147,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "theatre-11": {
+ "x": 168,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "grocery-11": {
+ "x": 189,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "town-hall-11": {
+ "x": 210,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rail-metro-11": {
+ "x": 231,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "triangle-11": {
+ "x": 252,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "hairdresser-11": {
+ "x": 273,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "triangle-stroked-11": {
+ "x": 294,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bank-11": {
+ "x": 315,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dentist-11": {
+ "x": 336,
+ "y": 351,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "harbor-11": {
+ "x": 372,
+ "y": 0,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "hospital-11": {
+ "x": 372,
+ "y": 21,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "cafe-11": {
+ "x": 372,
+ "y": 42,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "pharmacy-11": {
+ "x": 372,
+ "y": 63,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "ice-cream-11": {
+ "x": 372,
+ "y": 84,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "america-football-11": {
+ "x": 372,
+ "y": 105,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "bicycle-11": {
+ "x": 372,
+ "y": 126,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "baseball-11": {
+ "x": 372,
+ "y": 147,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "laundry-11": {
+ "x": 372,
+ "y": 168,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "basketball-11": {
+ "x": 372,
+ "y": 189,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "college-11": {
+ "x": 372,
+ "y": 210,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "campsite-11": {
+ "x": 372,
+ "y": 231,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "library-11": {
+ "x": 372,
+ "y": 252,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "cemetery-11": {
+ "x": 372,
+ "y": 273,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "car-11": {
+ "x": 372,
+ "y": 294,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "dog-park-11": {
+ "x": 372,
+ "y": 315,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "lodging-11": {
+ "x": 372,
+ "y": 336,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "golf-11": {
+ "x": 0,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "rail-light-11": {
+ "x": 21,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "park-11": {
+ "x": 42,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "marker-11": {
+ "x": 63,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "cinema-11": {
+ "x": 84,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "monument-11": {
+ "x": 105,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "playground-11": {
+ "x": 126,
+ "y": 372,
+ "width": 19,
+ "height": 19,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-5-large": {
+ "x": 147,
+ "y": 372,
+ "width": 48,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-1-large": {
+ "x": 197,
+ "y": 372,
+ "width": 18,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-3-small": {
+ "x": 217,
+ "y": 372,
+ "width": 25,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-2-small": {
+ "x": 244,
+ "y": 372,
+ "width": 21,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-1-small": {
+ "x": 205,
+ "y": 162,
+ "width": 17,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-2-large": {
+ "x": 267,
+ "y": 372,
+ "width": 25,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-6-large": {
+ "x": 294,
+ "y": 372,
+ "width": 50,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-3-large": {
+ "x": 346,
+ "y": 372,
+ "width": 32,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-5-large": {
+ "x": 393,
+ "y": 0,
+ "width": 45,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-4-large": {
+ "x": 393,
+ "y": 20,
+ "width": 39,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-1-large": {
+ "x": 393,
+ "y": 40,
+ "width": 22,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-6-large": {
+ "x": 0,
+ "y": 393,
+ "width": 54,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-2-large": {
+ "x": 393,
+ "y": 60,
+ "width": 28,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-4-large": {
+ "x": 393,
+ "y": 80,
+ "width": 42,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-3-large": {
+ "x": 393,
+ "y": 100,
+ "width": 35,
+ "height": 18,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-duplex-5-small": {
+ "x": 393,
+ "y": 120,
+ "width": 29,
+ "height": 17,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-duplex-4-small": {
+ "x": 393,
+ "y": 139,
+ "width": 28,
+ "height": 17,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-highway-duplex-3-small": {
+ "x": 393,
+ "y": 158,
+ "width": 27,
+ "height": 17,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "entrance-11": {
+ "x": 417,
+ "y": 40,
+ "width": 17,
+ "height": 17,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "marsh-16": {
+ "x": 422,
+ "y": 158,
+ "width": 16,
+ "height": 16,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-1-small": {
+ "x": 393,
+ "y": 177,
+ "width": 17,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-6-small": {
+ "x": 393,
+ "y": 194,
+ "width": 45,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-4-small": {
+ "x": 393,
+ "y": 211,
+ "width": 33,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-3-small": {
+ "x": 393,
+ "y": 228,
+ "width": 27,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-5-small": {
+ "x": 393,
+ "y": 245,
+ "width": 38,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-2-small": {
+ "x": 412,
+ "y": 177,
+ "width": 21,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-2-small": {
+ "x": 393,
+ "y": 262,
+ "width": 23,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-1-small": {
+ "x": 423,
+ "y": 60,
+ "width": 15,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-4-small": {
+ "x": 393,
+ "y": 279,
+ "width": 35,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "metro-11": {
+ "x": 423,
+ "y": 139,
+ "width": 15,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-3-small": {
+ "x": 393,
+ "y": 296,
+ "width": 29,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "us-state-5-small": {
+ "x": 393,
+ "y": 313,
+ "width": 40,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "default-6-small": {
+ "x": 393,
+ "y": 330,
+ "width": 44,
+ "height": 15,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "oneway-spaced-white-large": {
+ "x": 424,
+ "y": 120,
+ "width": 14,
+ "height": 6,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "oneway-spaced-large": {
+ "x": 424,
+ "y": 128,
+ "width": 14,
+ "height": 6,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "oneway-spaced-small": {
+ "x": 422,
+ "y": 228,
+ "width": 11,
+ "height": 5,
+ "pixelRatio": 1,
+ "sdf": false
+ },
+ "oneway-spaced-white-small": {
+ "x": 422,
+ "y": 235,
+ "width": 11,
+ "height": 5,
+ "pixelRatio": 1,
+ "sdf": false
+ }
+} \ No newline at end of file
diff --git a/ios/benchmark/assets/sprites/mapbox-streets.png b/ios/benchmark/assets/sprites/mapbox-streets.png
new file mode 100644
index 0000000000..00925f91a2
--- /dev/null
+++ b/ios/benchmark/assets/sprites/mapbox-streets.png
Binary files differ
diff --git a/ios/benchmark/assets/sprites/mapbox-streets@2x.json b/ios/benchmark/assets/sprites/mapbox-streets@2x.json
new file mode 100644
index 0000000000..0a193fb4db
--- /dev/null
+++ b/ios/benchmark/assets/sprites/mapbox-streets@2x.json
@@ -0,0 +1,2034 @@
+{
+ "secondary_marker": {
+ "x": 0,
+ "y": 0,
+ "width": 40,
+ "height": 100,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default_marker": {
+ "x": 42,
+ "y": 0,
+ "width": 40,
+ "height": 100,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-business-1-large": {
+ "x": 84,
+ "y": 0,
+ "width": 54,
+ "height": 74,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-alternate-1-large": {
+ "x": 140,
+ "y": 0,
+ "width": 42,
+ "height": 74,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-alternate-2-large": {
+ "x": 0,
+ "y": 102,
+ "width": 54,
+ "height": 74,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-business-2-large": {
+ "x": 56,
+ "y": 102,
+ "width": 54,
+ "height": 74,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-truck-1-large": {
+ "x": 112,
+ "y": 102,
+ "width": 46,
+ "height": 70,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-truck-2-large": {
+ "x": 184,
+ "y": 0,
+ "width": 54,
+ "height": 70,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "marsh-32": {
+ "x": 240,
+ "y": 0,
+ "width": 64,
+ "height": 64,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-truck-1-small": {
+ "x": 240,
+ "y": 66,
+ "width": 34,
+ "height": 62,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-business-2-small": {
+ "x": 184,
+ "y": 72,
+ "width": 42,
+ "height": 62,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-alternate-2-small": {
+ "x": 0,
+ "y": 178,
+ "width": 42,
+ "height": 62,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-alternate-1-small": {
+ "x": 44,
+ "y": 178,
+ "width": 34,
+ "height": 62,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-truck-2-small": {
+ "x": 80,
+ "y": 178,
+ "width": 42,
+ "height": 62,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-business-1-small": {
+ "x": 124,
+ "y": 178,
+ "width": 34,
+ "height": 62,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-duplex-3-large": {
+ "x": 160,
+ "y": 178,
+ "width": 68,
+ "height": 56,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-3-large": {
+ "x": 230,
+ "y": 178,
+ "width": 68,
+ "height": 56,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-duplex-4-large": {
+ "x": 0,
+ "y": 242,
+ "width": 78,
+ "height": 56,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-1-large": {
+ "x": 80,
+ "y": 242,
+ "width": 48,
+ "height": 56,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-duplex-5-large": {
+ "x": 130,
+ "y": 242,
+ "width": 84,
+ "height": 56,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-2-large": {
+ "x": 216,
+ "y": 242,
+ "width": 56,
+ "height": 56,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-business-1-large": {
+ "x": 306,
+ "y": 0,
+ "width": 48,
+ "height": 54,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-business-2-large": {
+ "x": 0,
+ "y": 300,
+ "width": 56,
+ "height": 54,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-business-3-large": {
+ "x": 58,
+ "y": 300,
+ "width": 68,
+ "height": 54,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-1-large": {
+ "x": 306,
+ "y": 56,
+ "width": 40,
+ "height": 52,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-2-large": {
+ "x": 128,
+ "y": 300,
+ "width": 50,
+ "height": 52,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-3-large": {
+ "x": 180,
+ "y": 300,
+ "width": 60,
+ "height": 52,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-4-large": {
+ "x": 242,
+ "y": 300,
+ "width": 74,
+ "height": 52,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-4-large": {
+ "x": 356,
+ "y": 0,
+ "width": 72,
+ "height": 50,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-3-large": {
+ "x": 356,
+ "y": 52,
+ "width": 62,
+ "height": 50,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-duplex-5-small": {
+ "x": 356,
+ "y": 104,
+ "width": 70,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-2-small": {
+ "x": 356,
+ "y": 154,
+ "width": 48,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-duplex-3-small": {
+ "x": 356,
+ "y": 204,
+ "width": 58,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-duplex-4-small": {
+ "x": 356,
+ "y": 254,
+ "width": 66,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-1-small": {
+ "x": 356,
+ "y": 304,
+ "width": 40,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-2-large": {
+ "x": 0,
+ "y": 356,
+ "width": 50,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-3-small": {
+ "x": 52,
+ "y": 356,
+ "width": 58,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-1-large": {
+ "x": 306,
+ "y": 110,
+ "width": 40,
+ "height": 48,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "music-15": {
+ "x": 306,
+ "y": 160,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "place-of-worship-15": {
+ "x": 306,
+ "y": 208,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "police-15": {
+ "x": 240,
+ "y": 130,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "post-15": {
+ "x": 112,
+ "y": 356,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "prison-15": {
+ "x": 160,
+ "y": 356,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "religious-christian-15": {
+ "x": 208,
+ "y": 356,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "religious-jewish-15": {
+ "x": 256,
+ "y": 356,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "religious-muslim-15": {
+ "x": 304,
+ "y": 356,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rocket-15": {
+ "x": 352,
+ "y": 356,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "shop-15": {
+ "x": 430,
+ "y": 0,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "star-15": {
+ "x": 430,
+ "y": 48,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "suitcase-15": {
+ "x": 430,
+ "y": 96,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "swimming-15": {
+ "x": 430,
+ "y": 144,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "theatre-15": {
+ "x": 430,
+ "y": 192,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "town-hall-15": {
+ "x": 430,
+ "y": 240,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "triangle-15": {
+ "x": 430,
+ "y": 288,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "triangle-stroked-15": {
+ "x": 430,
+ "y": 336,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dentist-15": {
+ "x": 0,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "hospital-15": {
+ "x": 48,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "pharmacy-15": {
+ "x": 96,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "america-football-15": {
+ "x": 144,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "baseball-15": {
+ "x": 192,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "basketball-15": {
+ "x": 240,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "campsite-15": {
+ "x": 288,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "cemetery-15": {
+ "x": 336,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dog-park-15": {
+ "x": 384,
+ "y": 406,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "beer-15": {
+ "x": 478,
+ "y": 0,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "park-15": {
+ "x": 478,
+ "y": 48,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bar-15": {
+ "x": 478,
+ "y": 96,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "playground-15": {
+ "x": 478,
+ "y": 144,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "zoo-15": {
+ "x": 478,
+ "y": 192,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "ferry-15": {
+ "x": 478,
+ "y": 240,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bus-15": {
+ "x": 478,
+ "y": 288,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "airport-15": {
+ "x": 478,
+ "y": 336,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "college-15": {
+ "x": 478,
+ "y": 384,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "airfield-15": {
+ "x": 0,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "school-15": {
+ "x": 48,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rail-metro-15": {
+ "x": 96,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "cafe-15": {
+ "x": 144,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "fast-food-15": {
+ "x": 192,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rail-light-15": {
+ "x": 240,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rail-15": {
+ "x": 288,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-business-3-small": {
+ "x": 336,
+ "y": 454,
+ "width": 58,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "heliport-15": {
+ "x": 396,
+ "y": 454,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-business-2-small": {
+ "x": 444,
+ "y": 454,
+ "width": 48,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "restaurant-15": {
+ "x": 526,
+ "y": 0,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "alcohol-shop-15": {
+ "x": 526,
+ "y": 48,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-interstate-business-1-small": {
+ "x": 526,
+ "y": 96,
+ "width": 40,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "art-gallery-15": {
+ "x": 526,
+ "y": 144,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bakery-15": {
+ "x": 526,
+ "y": 192,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bank-15": {
+ "x": 526,
+ "y": 240,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bicycle-15": {
+ "x": 526,
+ "y": 288,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "car-15": {
+ "x": 526,
+ "y": 336,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "cinema-15": {
+ "x": 526,
+ "y": 384,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "circle-15": {
+ "x": 526,
+ "y": 432,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "circle-stroked-15": {
+ "x": 0,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "clothing-store-15": {
+ "x": 48,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "embassy-15": {
+ "x": 96,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "fire-station-15": {
+ "x": 144,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "fuel-15": {
+ "x": 192,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "garden-15": {
+ "x": 240,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "grocery-15": {
+ "x": 288,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "hairdresser-15": {
+ "x": 336,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "harbor-15": {
+ "x": 384,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "ice-cream-15": {
+ "x": 432,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "laundry-15": {
+ "x": 480,
+ "y": 502,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "library-15": {
+ "x": 574,
+ "y": 0,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "lodging-15": {
+ "x": 574,
+ "y": 48,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "marker-15": {
+ "x": 574,
+ "y": 96,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "monument-15": {
+ "x": 574,
+ "y": 144,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "museum-15": {
+ "x": 574,
+ "y": 192,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "golf-15": {
+ "x": 574,
+ "y": 240,
+ "width": 46,
+ "height": 46,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-4-small": {
+ "x": 0,
+ "y": 550,
+ "width": 62,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-3-small": {
+ "x": 64,
+ "y": 550,
+ "width": 50,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-duplex-5-large": {
+ "x": 116,
+ "y": 550,
+ "width": 74,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-2-small": {
+ "x": 574,
+ "y": 288,
+ "width": 42,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-duplex-4-large": {
+ "x": 192,
+ "y": 550,
+ "width": 68,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-federal-1-small": {
+ "x": 574,
+ "y": 334,
+ "width": 34,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-duplex-3-large": {
+ "x": 262,
+ "y": 550,
+ "width": 64,
+ "height": 44,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-1-large": {
+ "x": 574,
+ "y": 380,
+ "width": 40,
+ "height": 42,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-2-large": {
+ "x": 328,
+ "y": 550,
+ "width": 54,
+ "height": 42,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-3-large": {
+ "x": 384,
+ "y": 550,
+ "width": 60,
+ "height": 42,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-3-small": {
+ "x": 184,
+ "y": 136,
+ "width": 50,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-1-small": {
+ "x": 574,
+ "y": 424,
+ "width": 34,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-2-small": {
+ "x": 574,
+ "y": 466,
+ "width": 42,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "mx-state-4-small": {
+ "x": 446,
+ "y": 550,
+ "width": 58,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "u-bahn-11": {
+ "x": 574,
+ "y": 508,
+ "width": 40,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "subway-11": {
+ "x": 306,
+ "y": 256,
+ "width": 40,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "light-11": {
+ "x": 432,
+ "y": 406,
+ "width": 40,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "circle.sdf": {
+ "x": 528,
+ "y": 502,
+ "width": 38,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": true
+ },
+ "washington-metro-11": {
+ "x": 506,
+ "y": 550,
+ "width": 40,
+ "height": 40,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "zoo-11": {
+ "x": 548,
+ "y": 550,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "beer-11": {
+ "x": 622,
+ "y": 0,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "heliport-11": {
+ "x": 622,
+ "y": 40,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "museum-11": {
+ "x": 622,
+ "y": 80,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "ferry-11": {
+ "x": 622,
+ "y": 120,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "circle-11": {
+ "x": 622,
+ "y": 160,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bus-11": {
+ "x": 622,
+ "y": 200,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "music-11": {
+ "x": 622,
+ "y": 240,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "school-11": {
+ "x": 622,
+ "y": 280,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "airport-11": {
+ "x": 622,
+ "y": 320,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "place-of-worship-11": {
+ "x": 622,
+ "y": 360,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "airfield-11": {
+ "x": 622,
+ "y": 400,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "circle-stroked-11": {
+ "x": 622,
+ "y": 440,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "police-11": {
+ "x": 622,
+ "y": 480,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "fast-food-11": {
+ "x": 622,
+ "y": 520,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "post-11": {
+ "x": 0,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "clothing-store-11": {
+ "x": 40,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "prison-11": {
+ "x": 80,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "alcohol-shop-11": {
+ "x": 120,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rail-11": {
+ "x": 160,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "religious-christian-11": {
+ "x": 200,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "embassy-11": {
+ "x": 240,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "religious-jewish-11": {
+ "x": 280,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bar-11": {
+ "x": 320,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "religious-muslim-11": {
+ "x": 360,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "fire-station-11": {
+ "x": 400,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rocket-11": {
+ "x": 440,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "art-gallery-11": {
+ "x": 480,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "shop-11": {
+ "x": 520,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "fuel-11": {
+ "x": 560,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "star-11": {
+ "x": 600,
+ "y": 596,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "restaurant-11": {
+ "x": 662,
+ "y": 0,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "suitcase-11": {
+ "x": 662,
+ "y": 40,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "garden-11": {
+ "x": 662,
+ "y": 80,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "swimming-11": {
+ "x": 662,
+ "y": 120,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bakery-11": {
+ "x": 662,
+ "y": 160,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "theatre-11": {
+ "x": 662,
+ "y": 200,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "grocery-11": {
+ "x": 662,
+ "y": 240,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "town-hall-11": {
+ "x": 662,
+ "y": 280,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rail-metro-11": {
+ "x": 662,
+ "y": 320,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "triangle-11": {
+ "x": 662,
+ "y": 360,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "hairdresser-11": {
+ "x": 662,
+ "y": 400,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "triangle-stroked-11": {
+ "x": 662,
+ "y": 440,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bank-11": {
+ "x": 662,
+ "y": 480,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dentist-11": {
+ "x": 662,
+ "y": 520,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "harbor-11": {
+ "x": 662,
+ "y": 560,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "hospital-11": {
+ "x": 0,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "cafe-11": {
+ "x": 40,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "pharmacy-11": {
+ "x": 80,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "ice-cream-11": {
+ "x": 120,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "america-football-11": {
+ "x": 160,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "bicycle-11": {
+ "x": 200,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "baseball-11": {
+ "x": 240,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "laundry-11": {
+ "x": 280,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "basketball-11": {
+ "x": 320,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "college-11": {
+ "x": 360,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "campsite-11": {
+ "x": 400,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "library-11": {
+ "x": 440,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "cemetery-11": {
+ "x": 480,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "car-11": {
+ "x": 520,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dog-park-11": {
+ "x": 560,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "lodging-11": {
+ "x": 600,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "golf-11": {
+ "x": 640,
+ "y": 636,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rail-light-11": {
+ "x": 702,
+ "y": 0,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "park-11": {
+ "x": 702,
+ "y": 40,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "marker-11": {
+ "x": 702,
+ "y": 80,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "cinema-11": {
+ "x": 702,
+ "y": 120,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "monument-11": {
+ "x": 702,
+ "y": 160,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "playground-11": {
+ "x": 702,
+ "y": 200,
+ "width": 38,
+ "height": 38,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-3-small": {
+ "x": 0,
+ "y": 676,
+ "width": 50,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-1-small": {
+ "x": 702,
+ "y": 240,
+ "width": 34,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dlr-11": {
+ "x": 702,
+ "y": 278,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dlr.london-overground.london-underground.national-rail-11": {
+ "x": 52,
+ "y": 676,
+ "width": 148,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dlr.london-underground-11": {
+ "x": 202,
+ "y": 676,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-6-large": {
+ "x": 280,
+ "y": 676,
+ "width": 100,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dlr.london-underground.national-rail-11": {
+ "x": 382,
+ "y": 676,
+ "width": 112,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "dlr.national-rail-11": {
+ "x": 496,
+ "y": 676,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-5-large": {
+ "x": 574,
+ "y": 676,
+ "width": 90,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "london-overground-11": {
+ "x": 702,
+ "y": 316,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-4-large": {
+ "x": 742,
+ "y": 0,
+ "width": 78,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "london-overground.london-underground-11": {
+ "x": 742,
+ "y": 38,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-3-large": {
+ "x": 742,
+ "y": 76,
+ "width": 65,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "london-overground.london-underground.national-rail-11": {
+ "x": 0,
+ "y": 714,
+ "width": 112,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-2-large": {
+ "x": 742,
+ "y": 114,
+ "width": 50,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-6-large": {
+ "x": 114,
+ "y": 714,
+ "width": 108,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-1-large": {
+ "x": 742,
+ "y": 152,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "weiner-linien-11": {
+ "x": 780,
+ "y": 152,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "transilien-11": {
+ "x": 742,
+ "y": 190,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "s-bahn-11": {
+ "x": 780,
+ "y": 190,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rer.transilien-11": {
+ "x": 742,
+ "y": 228,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "rer-11": {
+ "x": 742,
+ "y": 266,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "national-rail-11": {
+ "x": 780,
+ "y": 266,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "moscow-metro-11": {
+ "x": 742,
+ "y": 304,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "metro.rer-11": {
+ "x": 742,
+ "y": 342,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-5-large": {
+ "x": 224,
+ "y": 714,
+ "width": 96,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "london-underground.national-rail-11": {
+ "x": 742,
+ "y": 380,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-2-small": {
+ "x": 742,
+ "y": 418,
+ "width": 42,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "london-overground.national-rail-11": {
+ "x": 742,
+ "y": 456,
+ "width": 76,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-1-large": {
+ "x": 742,
+ "y": 494,
+ "width": 44,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-4-large": {
+ "x": 322,
+ "y": 714,
+ "width": 84,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-2-large": {
+ "x": 742,
+ "y": 532,
+ "width": 56,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-3-large": {
+ "x": 742,
+ "y": 570,
+ "width": 70,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "london-underground-11": {
+ "x": 780,
+ "y": 304,
+ "width": 36,
+ "height": 36,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-duplex-3-small": {
+ "x": 742,
+ "y": 608,
+ "width": 54,
+ "height": 34,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-duplex-4-small": {
+ "x": 742,
+ "y": 644,
+ "width": 56,
+ "height": 34,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-highway-duplex-5-small": {
+ "x": 666,
+ "y": 676,
+ "width": 58,
+ "height": 34,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "marsh-16": {
+ "x": 786,
+ "y": 418,
+ "width": 32,
+ "height": 32,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "entrance-11": {
+ "x": 788,
+ "y": 494,
+ "width": 32,
+ "height": 32,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-1-small": {
+ "x": 742,
+ "y": 680,
+ "width": 30,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-2-small": {
+ "x": 774,
+ "y": 680,
+ "width": 46,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-2-small": {
+ "x": 408,
+ "y": 714,
+ "width": 42,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-3-small": {
+ "x": 452,
+ "y": 714,
+ "width": 54,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-4-small": {
+ "x": 508,
+ "y": 714,
+ "width": 66,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-3-small": {
+ "x": 576,
+ "y": 714,
+ "width": 58,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-5-small": {
+ "x": 636,
+ "y": 714,
+ "width": 76,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-5-small": {
+ "x": 714,
+ "y": 714,
+ "width": 80,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-6-small": {
+ "x": 0,
+ "y": 752,
+ "width": 90,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "default-6-small": {
+ "x": 92,
+ "y": 752,
+ "width": 88,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-4-small": {
+ "x": 182,
+ "y": 752,
+ "width": 70,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "us-state-1-small": {
+ "x": 702,
+ "y": 354,
+ "width": 34,
+ "height": 30,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "metro-11": {
+ "x": 702,
+ "y": 386,
+ "width": 28,
+ "height": 28,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "oneway-spaced-white-large": {
+ "x": 702,
+ "y": 416,
+ "width": 28,
+ "height": 12,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "oneway-spaced-large": {
+ "x": 702,
+ "y": 430,
+ "width": 28,
+ "height": 12,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "oneway-spaced-small": {
+ "x": 794,
+ "y": 114,
+ "width": 22,
+ "height": 10,
+ "pixelRatio": 2,
+ "sdf": false
+ },
+ "oneway-spaced-white-small": {
+ "x": 794,
+ "y": 126,
+ "width": 22,
+ "height": 10,
+ "pixelRatio": 2,
+ "sdf": false
+ }
+} \ No newline at end of file
diff --git a/ios/benchmark/assets/sprites/mapbox-streets@2x.png b/ios/benchmark/assets/sprites/mapbox-streets@2x.png
new file mode 100644
index 0000000000..0d5bd533f7
--- /dev/null
+++ b/ios/benchmark/assets/sprites/mapbox-streets@2x.png
Binary files differ
diff --git a/ios/benchmark/assets/styles/mapbox-streets-v7.json b/ios/benchmark/assets/styles/mapbox-streets-v7.json
new file mode 100644
index 0000000000..62e0f66696
--- /dev/null
+++ b/ios/benchmark/assets/styles/mapbox-streets-v7.json
@@ -0,0 +1,3917 @@
+{
+ "version": 7,
+ "name": "mapbox-streets",
+ "constants": {
+ "@poi-scalerank3": {
+ "base": 1,
+ "stops": [[16, 11], [20, 13]]
+ },
+ "@label-neighbourhood": "#805540",
+ "@hillshade-shadow": "#5a5517",
+ "@road-width-minor": {
+ "base": 1.5,
+ "stops": [[14, 0.5], [18, 12]]
+ },
+ "@poi-scalerank4": {
+ "base": 1,
+ "stops": [[16, 11], [20, 13]]
+ },
+ "@wetlands": "#9DD3D8",
+ "@landuse-cemetery": "#dde6c2",
+ "@admin-2-boundary": {
+ "base": 1,
+ "stops": [[3, 0.5], [10, 2]]
+ },
+ "@snow": "#fff",
+ "@path-opacity": {
+ "base": 1,
+ "stops": [[15, 0], [15.25, 1]]
+ },
+ "@label-park": "#4c661f",
+ "@landuse-school": "#f3ebb4",
+ "@label-water-dark": "#004087",
+ "@road-main": "#a2a2a2",
+ "@road-case-dark": "#d9d3c9",
+ "@path-bg-width": {
+ "base": 1.5,
+ "stops": [[15, 2], [18, 7]]
+ },
+ "@road-trunk": "#f2cf60",
+ "@road-motorway": "#ffa159",
+ "@road-minor": "#fff",
+ "@rail-track-width": {
+ "base": 1.5,
+ "stops": [[14, 4], [20, 8]]
+ },
+ "@label-primary": "#000000",
+ "@street-high-opacity": {
+ "base": 1,
+ "stops": [[13.99, 0], [14, 1]]
+ },
+ "@label-city-lg-size": {
+ "base": 0.9,
+ "stops": [[4, 12], [10, 22]]
+ },
+ "@landuse-industrial": "#e0dae0",
+ "@landcover-opacity": {
+ "base": 1.5,
+ "stops": [[2, 0.3], [14, 0]]
+ },
+ "@rail-width": {
+ "base": 1.5,
+ "stops": [[14, 0.5], [20, 1]]
+ },
+ "@landuse-hospital": "#f4dcdc",
+ "@land": "#ede9d9",
+ "@name": "{name_en}",
+ "@landcover": "#ddecb1",
+ "@tunnel-case-dark": "#c4beb7",
+ "@aeroway": "#dbcedb",
+ "@label-city-md-size": {
+ "base": 0.9,
+ "stops": [[5, 12], [12, 22]]
+ },
+ "@tunnel-trunk": "#f2de9e",
+ "@landuse-pitch": "#c3e194",
+ "@admin": "#787680",
+ "@road-case-width-sm": {
+ "base": 1.5,
+ "stops": [[12, 0.75], [20, 2]]
+ },
+ "@label-poi": "#65513d",
+ "@main-width": {
+ "base": 1.5,
+ "stops": [[8.5, 0.5], [10, 0.75], [18, 26]]
+ },
+ "@road-case-width-lg": {
+ "base": 1.5,
+ "stops": [[5, 0.75], [16, 2]]
+ },
+ "@road-high-z-fadein": {
+ "base": 1.2,
+ "stops": [[5, 0], [5.5, 1]]
+ },
+ "@rail": "#b3ada6",
+ "@country-halo": "rgba(255,255,255,0.75)",
+ "@hillshade-highlight": "#fff",
+ "@motorway-width": {
+ "base": 1.5,
+ "stops": [[5, 0.75], [18, 32]]
+ },
+ "@country-label-color": {
+ "stops": [[8, "#000000"], [10, "#888888"]],
+ "base": 1
+ },
+ "@building": "#e8e0cc",
+ "@landuse-sand": "#ededcf",
+ "@road-trunk-case": "#fff",
+ "@ramp-1": {
+ "base": 1,
+ "stops": [[0, [1, 2]], [20, [1, 0.25]]]
+ },
+ "@road-motorway-case": "#fff",
+ "@street_limited-width": {
+ "base": 1.5,
+ "stops": [[12.5, 0.5], [14, 2], [18, 12]]
+ },
+ "@water": "#8ccbf7",
+ "@ramp-2": {
+ "base": 1,
+ "stops": [[14, [0.4, 0.4]], [15, [0.3, 0.3]], [16, [0.2, 0.2]], [18, [0.15, 0.15]], [19, [0.1, 0.1]]]
+ },
+ "@label-state": "#242424",
+ "@landuse-parks": "#cde8a2",
+ "@street_limited-case-width": {
+ "base": 1.5,
+ "stops": [[13, 0], [14, 2], [18, 12]]
+ },
+ "@motorway_link-width": {
+ "base": 1.5,
+ "stops": [[12, 0.5], [14, 2], [18, 18]]
+ },
+ "@building-shadow": "#cbc6b7",
+ "@label-road": "#3a3836",
+ "@rail-low": "#ccc5bd",
+ "@label-transit": "#000000",
+ "@rail-lowhigh": {
+ "stops": [[13, "#d8d5c8"], [16, "#b3b1a6"]]
+ },
+ "@street-case-gap-width": {
+ "base": 1.5,
+ "stops": [[13, 0], [14, 2], [18, 18]]
+ },
+ "@halo": "#ffffff",
+ "@street-width": {
+ "base": 1.5,
+ "stops": [[12.5, 0.5], [14, 2], [18, 18]]
+ },
+ "@main-case-width": {
+ "base": 1.2,
+ "stops": [[10, 0.75], [18, 2]]
+ },
+ "@road-street-limited": "#EFEDEB",
+ "@landuse-glacier": "#dcedf9",
+ "@label-water": "#c8e5f9",
+ "@poi-scalerank1": {
+ "base": 1,
+ "stops": [[10, 11], [18, 14]]
+ },
+ "@path-width": {
+ "base": 1.5,
+ "stops": [[15, 1], [18, 4]]
+ },
+ "@tunnel-motorway": "#ffbe8c",
+ "@poi-scalerank2": {
+ "base": 1,
+ "stops": [[14, 11], [20, 14]]
+ }
+ },
+ "sources": {
+ "mapbox://mapbox.mapbox-streets-v6": {
+ "url": "asset://tiles/mapbox.mapbox-streets-v6.json",
+ "type": "vector"
+ },
+ "mapbox://mapbox.mapbox-terrain-v2": {
+ "url": "asset://tiles/mapbox.mapbox-terrain-v2.json",
+ "type": "vector"
+ }
+ },
+ "sprite": "asset://sprites/mapbox-streets",
+ "glyphs": "asset://glyphs/{fontstack}/{range}.pbf",
+ "layers": [{
+ "id": "background",
+ "type": "background",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "background-color": "@land"
+ }
+ }, {
+ "id": "landcover_crop",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "landcover",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "crop"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": "@landcover-opacity",
+ "fill-antialias": false
+ }
+ }, {
+ "id": "landcover_grass",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "landcover",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "grass"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": "@landcover-opacity",
+ "fill-antialias": false
+ }
+ }, {
+ "id": "landcover_scrub",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "landcover",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "scrub"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": "@landcover-opacity",
+ "fill-antialias": false
+ }
+ }, {
+ "id": "landcover_wood",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "landcover",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "wood"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": "@landcover-opacity",
+ "fill-antialias": false
+ }
+ }, {
+ "id": "landcover_snow",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "landcover",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "snow"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@snow",
+ "fill-opacity": 0.2,
+ "fill-antialias": false
+ }
+ }, {
+ "id": "parks",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "park"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-parks",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[5, 0], [6, 1]]
+ }
+ }
+ }, {
+ "id": "scrub",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 9,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "scrub"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[9, 0], [16, 0.2]]
+ }
+ }
+ }, {
+ "id": "grass",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 9,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "grass"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[9, 0], [16, 0.4]]
+ }
+ }
+ }, {
+ "id": "wood",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 6,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "wood"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landcover",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[6, 0], [16, 0.5]]
+ }
+ }
+ }, {
+ "id": "hospital",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "hospital"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-hospital"
+ }
+ }, {
+ "id": "glaciers",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 9,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "glacier"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-glacier",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[9, 0], [10, 0.25]]
+ }
+ }
+ }, {
+ "id": "pitch",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "pitch"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-pitch"
+ }
+ }, {
+ "id": "pitch-line",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "pitch"]],
+ "layout": {},
+ "paint": {
+ "line-color": "#e1f2c6"
+ }
+ }, {
+ "id": "school",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "school"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-school"
+ }
+ }, {
+ "id": "cemetery",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "cemetery"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-cemetery"
+ }
+ }, {
+ "id": "industrial",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "industrial"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-industrial"
+ }
+ }, {
+ "id": "sand",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "sand"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@landuse-sand"
+ }
+ }, {
+ "id": "hillshade_highlight_bright",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "hillshade",
+ "filter": ["all", ["==", "level", 94]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@hillshade-highlight",
+ "fill-opacity": {
+ "stops": [[15, 0.12], [18, 0]]
+ },
+ "fill-antialias": false
+ }
+ }, {
+ "id": "hillshade_highlight_med",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "hillshade",
+ "filter": ["all", ["==", "level", 90]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@hillshade-highlight",
+ "fill-opacity": {
+ "stops": [[15, 0.12], [18, 0]]
+ },
+ "fill-antialias": false
+ }
+ }, {
+ "id": "hillshade_shadow_faint",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "hillshade",
+ "filter": ["all", ["==", "level", 89]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@hillshade-shadow",
+ "fill-opacity": {
+ "stops": [[15, 0.05], [17, 0]]
+ },
+ "fill-antialias": false
+ }
+ }, {
+ "id": "hillshade_shadow_med",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "hillshade",
+ "filter": ["all", ["==", "level", 78]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@hillshade-shadow",
+ "fill-opacity": {
+ "stops": [[15, 0.05], [17, 0]]
+ },
+ "fill-antialias": false
+ }
+ }, {
+ "id": "hillshade_shadow_dark",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "hillshade",
+ "filter": ["all", ["==", "level", 67]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@hillshade-shadow",
+ "fill-opacity": {
+ "stops": [[15, 0.06], [17, 0]]
+ },
+ "fill-antialias": false
+ }
+ }, {
+ "id": "hillshade_shadow_extreme",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "hillshade",
+ "filter": ["all", ["==", "level", 56]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@hillshade-shadow",
+ "fill-opacity": {
+ "stops": [[15, 0.06], [17, 0]]
+ },
+ "fill-antialias": false
+ }
+ }, {
+ "id": "waterway-river",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "waterway",
+ "minzoom": 8,
+ "maxzoom": 22,
+ "filter": ["any", ["==", "class", "river"], ["==", "class", "canal"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": {
+ "base": 1,
+ "stops": [[0, "butt"], [11, "round"]]
+ },
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "@water",
+ "line-width": {
+ "base": 1.3,
+ "stops": [[8.5, 0.1], [20, 8]]
+ },
+ "line-opacity": {
+ "base": 1,
+ "stops": [[8, 0], [8.5, 1]]
+ }
+ }
+ }, {
+ "id": "waterway-other",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "waterway",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["!=", "class", "river"], ["!=", "class", "canal"]],
+ "layout": {
+ "visibility": "visible",
+ "line-join": "round",
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "@water",
+ "line-width": {
+ "base": 1.35,
+ "stops": [[13.5, 0.1], [20, 3]]
+ },
+ "line-opacity": {
+ "base": 1,
+ "stops": [[13, 0], [13.5, 1]]
+ }
+ }
+ }, {
+ "id": "water",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "water",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@water"
+ }
+ }, {
+ "id": "landuse-overlay",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse_overlay",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all"],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@wetlands",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[10, 0.25], [10.5, 0.15]]
+ }
+ }
+ }, {
+ "id": "landuse-overlay-pattern",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "landuse_overlay",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all"],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@wetlands",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[10, 0], [10.5, 1]]
+ },
+ "fill-image": {
+ "base": 1,
+ "stops": [[13, "marsh-16"], [14, "marsh-32"]]
+ }
+ }
+ }, {
+ "id": "barrier_line-land-polygon",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "barrier_line",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "land"], ["==", "$type", "Polygon"]],
+ "layout": {},
+ "paint": {
+ "fill-color": "@land"
+ }
+ }, {
+ "id": "barrier_line-land-line",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "barrier_line",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "land"], ["==", "$type", "LineString"]],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-width": {
+ "base": 1.99,
+ "stops": [[14, 0.75], [20, 40]]
+ },
+ "line-color": "@land"
+ }
+ }, {
+ "id": "building-bottom",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "building",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "@building-shadow",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[15.5, 0], [16, 1]]
+ }
+ }
+ }, {
+ "id": "building-top",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "building",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": {
+ "base": 1,
+ "stops": [[15, "@land"], [16, "@building"]]
+ },
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[15, 0], [15.5, 1]]
+ },
+ "fill-outline-color": "#d0cbbb",
+ "fill-translate": {
+ "base": 1,
+ "stops": [[15, [0, 0]], [20, [-5, -5]]]
+ }
+ }
+ }, {
+ "id": "aeroway-polygon",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "aeroway",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "$type", "Polygon"], ["!=", "type", "apron"]],
+ "layout": {},
+ "paint": {
+ "fill-color": "@aeroway",
+ "fill-opacity": {
+ "base": 1,
+ "stops": [[11, 0], [11.5, 1]]
+ }
+ }
+ }, {
+ "id": "aeroway-runway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "aeroway",
+ "minzoom": 9,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "type", "runway"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@aeroway",
+ "line-width": {
+ "base": 1.5,
+ "stops": [[9, 1], [18, 80]]
+ }
+ }
+ }, {
+ "id": "aeroway-taxiway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "aeroway",
+ "minzoom": 9,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "type", "taxiway"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@aeroway",
+ "line-width": {
+ "base": 1.5,
+ "stops": [[10, 0.5], [18, 20]]
+ }
+ }
+ }, {
+ "id": "admin-3-4-boundaries-bg",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "admin",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", [">=", "admin_level", 3], ["==", "maritime", 0]],
+ "layout": {
+ "visibility": "visible",
+ "line-join": "bevel"
+ },
+ "paint": {
+ "line-color": {
+ "base": 1,
+ "stops": [[8, "@land"], [16, "#f6e8e1"]]
+ },
+ "line-width": {
+ "base": 1,
+ "stops": [[3, 3.5], [10, 8]]
+ },
+ "line-opacity": {
+ "base": 1,
+ "stops": [[7, 0], [8, 0.75]]
+ },
+ "line-dasharray": [1, 0],
+ "line-translate": [0, 0],
+ "line-blur": {
+ "base": 1,
+ "stops": [[3, 0], [8, 3]]
+ }
+ }
+ }, {
+ "id": "tunnel-street_limited-polygon",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "Polygon"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "#EEE8E3",
+ "fill-opacity": 0.75
+ }
+ }, {
+ "id": "tunnel-path-bg",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "path"]],
+ "layout": {
+ "visibility": "none",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@path-bg-width",
+ "line-dasharray": [1, 0],
+ "line-color": "@road-case-dark",
+ "line-blur": 0,
+ "line-opacity": {
+ "base": 1,
+ "stops": [[15, 0], [15.25, 0.5]]
+ }
+ }
+ }, {
+ "id": "tunnel-path",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "path"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@path-width",
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[15, [0.1, 1.25]], [16, [0.1, 1.6]], [17, [0.1, 1.45]], [18, [0.1, 1.3]]]
+ },
+ "line-color": "#f5f2ee",
+ "line-opacity": "@path-opacity"
+ }
+ }, {
+ "id": "tunnel-street-low",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": {
+ "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]]
+ }
+ }
+ }, {
+ "id": "tunnel-street_limited-low",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street_limited"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": {
+ "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]]
+ }
+ }
+ }, {
+ "id": "tunnel-motorway_link-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway_link"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway_link-width",
+ "line-dasharray": [3, 3]
+ }
+ }, {
+ "id": "tunnel-service-driveway-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "service", "driveway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@tunnel-case-dark",
+ "line-gap-width": "@road-width-minor",
+ "line-dasharray": [3, 3]
+ }
+ }, {
+ "id": "tunnel-street_limited-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["!=", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@tunnel-case-dark",
+ "line-gap-width": "@street_limited-case-width",
+ "line-dasharray": [3, 3],
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "tunnel-street-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@tunnel-case-dark",
+ "line-gap-width": "@street-case-gap-width",
+ "line-dasharray": [3, 3],
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "tunnel-main-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["!=", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@main-case-width",
+ "line-dasharray": [3, 3],
+ "line-gap-width": "@main-width",
+ "line-color": "@tunnel-case-dark"
+ }
+ }, {
+ "id": "tunnel-trunk-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["==", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-lg",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway-width",
+ "line-opacity": 1,
+ "line-dasharray": [3, 3]
+ }
+ }, {
+ "id": "tunnel-motorway-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "motorway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-lg",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway-width",
+ "line-opacity": 1,
+ "line-dasharray": [3, 3]
+ }
+ }, {
+ "id": "tunnel-motorway_link",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway_link"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway_link-width",
+ "line-color": "@tunnel-motorway",
+ "line-opacity": 1,
+ "line-dasharray": [1, 0]
+ }
+ }, {
+ "id": "tunnel-service-driveway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "service", "driveway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-width-minor",
+ "line-color": "@road-minor",
+ "line-dasharray": [1, 0]
+ }
+ }, {
+ "id": "tunnel-construction",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["==", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "miter"
+ },
+ "paint": {
+ "line-width": "@street_limited-width",
+ "line-color": "@road-case-dark",
+ "line-opacity": "@street-high-opacity",
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[14, [0.4, 0.8]], [15, [0.3, 0.6]], [16, [0.2, 0.3]], [17, [0.2, 0.25]], [18, [0.15, 0.15]]]
+ }
+ }
+ }, {
+ "id": "tunnel-street_limited",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["!=", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street_limited-width",
+ "line-color": "@road-street-limited",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "tunnel-street",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "tunnel-main",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["!=", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@main-width",
+ "line-color": "@road-minor",
+ "line-opacity": 1,
+ "line-dasharray": [1, 0],
+ "line-blur": 0
+ }
+ }, {
+ "id": "tunnel-trunk",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["==", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway-width",
+ "line-color": "@tunnel-trunk"
+ }
+ }, {
+ "id": "tunnel-motorway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway-width",
+ "line-dasharray": [1, 0],
+ "line-opacity": 1,
+ "line-color": "@tunnel-motorway",
+ "line-blur": 0
+ }
+ }, {
+ "id": "tunnel-oneway-arrows-white",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "oneway", 1], ["any", ["in", "class", "motorway", "motorway_link"], ["in", "type", "trunk"]]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "symbol-placement": "line",
+ "icon-image": {
+ "base": 1,
+ "stops": [[16, "oneway-spaced-white-small"], [17, "oneway-spaced-white-large"]]
+ },
+ "icon-ignore-placement": true
+ },
+ "paint": {}
+ }, {
+ "id": "tunnel-oneway-arrows-color",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "oneway", 1], ["in", "class", "main", "street", "street_limited"], ["!=", "type", "trunk"]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "symbol-placement": "line",
+ "icon-image": {
+ "base": 1,
+ "stops": [[16, "oneway-spaced-small"], [17, "oneway-spaced-large"]]
+ },
+ "icon-ignore-placement": true
+ },
+ "paint": {}
+ }, {
+ "id": "tunnel-rail",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "major_rail", "minor_rail"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": {
+ "stops": [[13, "#d8d5c8"], [16, "#c0beb2"]]
+ },
+ "line-width": "@rail-width"
+ }
+ }, {
+ "id": "tunnel-rail-tracks",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "tunnel",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "major_rail", "minor_rail"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": {
+ "stops": [[13, "#d8d5c8"], [16, "#c0beb2"]]
+ },
+ "line-width": "@rail-track-width",
+ "line-dasharray": [0.1, 15],
+ "line-opacity": {
+ "base": 1,
+ "stops": [[13.75, 0], [20, 1]]
+ }
+ }
+ }, {
+ "id": "road-path-bg",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "path"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@path-bg-width",
+ "line-dasharray": [1, 0],
+ "line-color": "@road-case-dark",
+ "line-blur": 0,
+ "line-opacity": {
+ "base": 1,
+ "stops": [[15, 0], [15.25, 0.5]]
+ }
+ }
+ }, {
+ "id": "road-path",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "path"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@path-width",
+ "line-color": "@road-minor",
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[15, [0.1, 1.25]], [16, [0.1, 1.6]], [17, [0.1, 1.45]], [18, [0.1, 1.3]]]
+ },
+ "line-opacity": "@path-opacity"
+ }
+ }, {
+ "id": "road-street_limited-polygon-outline",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 12,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "Polygon"]],
+ "layout": {
+ "visibility": "none"
+ },
+ "paint": {
+ "line-color": "@road-case-dark",
+ "line-width": {
+ "base": 1.5,
+ "stops": [[12, 1.5], [20, 4]]
+ },
+ "line-opacity": 1
+ }
+ }, {
+ "id": "road-street-low",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": {
+ "stops": [[11, 0], [11.25, 1], [14, 1], [14.01, 0]]
+ }
+ }
+ }, {
+ "id": "road-street_limited-low",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street_limited"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": {
+ "stops": [[11, 0], [11.25, 1], [14, 1], [14.01, 0]]
+ }
+ }
+ }, {
+ "id": "road-motorway_link-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 10,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway_link"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway_link-width",
+ "line-opacity": {
+ "base": 1,
+ "stops": [[10.99, 0], [11, 1]]
+ }
+ }
+ }, {
+ "id": "road-service-driveway-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "service", "driveway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@road-width-minor"
+ }
+ }, {
+ "id": "road-street_limited-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["!=", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@street_limited-case-width",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "road-street-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@street-case-gap-width",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "road-main-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["!=", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@main-case-width",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@main-width",
+ "line-opacity": {
+ "base": 1,
+ "stops": [[9.99, 0], [10, 1]]
+ }
+ }
+ }, {
+ "id": "road-trunk-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 5,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "main"], ["in", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-lg",
+ "line-color": "@road-trunk-case",
+ "line-gap-width": "@motorway-width",
+ "line-opacity": {
+ "base": 1,
+ "stops": [[5.9, 0], [6, 1]]
+ }
+ }
+ }, {
+ "id": "road-motorway-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "motorway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-lg",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway-width",
+ "line-opacity": {
+ "base": 1.2,
+ "stops": [[5.9, 0], [6, 1]]
+ }
+ }
+ }, {
+ "id": "road-street_limited-polygon",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 12,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "Polygon"]],
+ "layout": {
+ "visibility": "none"
+ },
+ "paint": {
+ "fill-color": "@road-street-limited",
+ "fill-opacity": 1
+ }
+ }, {
+ "id": "road-service-driveway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "service", "driveway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-width-minor",
+ "line-color": "@road-minor"
+ }
+ }, {
+ "id": "road-motorway_link",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 10,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway_link"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway_link-width",
+ "line-color": "@road-motorway",
+ "line-opacity": 1
+ }
+ }, {
+ "id": "road-construction",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["==", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "miter"
+ },
+ "paint": {
+ "line-width": "@street_limited-width",
+ "line-color": "@road-case-dark",
+ "line-opacity": "@street-high-opacity",
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[14, [0.4, 0.8]], [15, [0.3, 0.6]], [16, [0.2, 0.3]], [17, [0.2, 0.25]], [18, [0.15, 0.15]]]
+ }
+ }
+ }, {
+ "id": "road-street_limited",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["!=", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street_limited-width",
+ "line-color": "@road-street-limited",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "road-street",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "road-main",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["!=", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@main-width",
+ "line-color": {
+ "base": 1,
+ "stops": [[5, "@land"], [8, "@road-minor"]]
+ },
+ "line-opacity": "@road-high-z-fadein"
+ }
+ }, {
+ "id": "road-trunk",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 5,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["==", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway-width",
+ "line-color": "@road-trunk"
+ }
+ }, {
+ "id": "road-motorway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway-width",
+ "line-color": {
+ "base": 1,
+ "stops": [[5.9, "#fff"], [6, "#ffa159"]]
+ },
+ "line-opacity": "@road-high-z-fadein"
+ }
+ }, {
+ "id": "road-oneway-arrows-white",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "oneway", 1], ["any", ["in", "class", "motorway", "motorway_link"], ["in", "type", "trunk"]]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "symbol-placement": "line",
+ "icon-image": {
+ "base": 1,
+ "stops": [[16, "oneway-spaced-white-small"], [17, "oneway-spaced-white-large"]]
+ },
+ "icon-ignore-placement": true
+ },
+ "paint": {}
+ }, {
+ "id": "road-oneway-arrows-color",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "oneway", 1], ["in", "class", "main", "street", "street_limited"], ["!=", "type", "trunk"]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "symbol-placement": "line",
+ "icon-image": {
+ "base": 1,
+ "stops": [[16, "oneway-spaced-small"], [17, "oneway-spaced-large"]]
+ },
+ "icon-ignore-placement": true,
+ "icon-rotation-alignment": "map"
+ },
+ "paint": {}
+ }, {
+ "id": "road-rail",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "major_rail", "minor_rail"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@rail-lowhigh",
+ "line-width": "@rail-width"
+ }
+ }, {
+ "id": "road-rail-tracks",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "major_rail", "minor_rail"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@rail-lowhigh",
+ "line-width": "@rail-track-width",
+ "line-dasharray": [0.1, 15],
+ "line-opacity": {
+ "base": 1,
+ "stops": [[13.75, 0], [14, 1]]
+ }
+ }
+ }, {
+ "id": "bridge-street_limited-polygon",
+ "type": "fill",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "Polygon"]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "fill-color": "#EEE8E3",
+ "fill-opacity": 0.75
+ }
+ }, {
+ "id": "bridge-path-bg",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "path"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@path-bg-width",
+ "line-dasharray": [1, 0],
+ "line-color": "@road-case-dark",
+ "line-blur": 0,
+ "line-opacity": {
+ "base": 1,
+ "stops": [[15, 0], [15.25, 0.75]]
+ }
+ }
+ }, {
+ "id": "bridge-path",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "path"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@path-width",
+ "line-color": "@road-minor",
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[14, [0.1, 1.25]], [16, [0.1, 1.6]], [17, [0.1, 1.45]], [18, [0.1, 1.3]]]
+ },
+ "line-opacity": "@path-opacity"
+ }
+ }, {
+ "id": "bridge-street-low",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": {
+ "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]]
+ }
+ }
+ }, {
+ "id": "bridge-street_limited-low",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street_limited"], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": {
+ "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]]
+ }
+ }
+ }, {
+ "id": "bridge-motorway_link-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 12,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway_link"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway_link-width",
+ "line-opacity": 1
+ }
+ }, {
+ "id": "bridge-service-driveway-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "service", "driveway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@road-width-minor"
+ }
+ }, {
+ "id": "bridge-street_limited-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["!=", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@street_limited-case-width"
+ }
+ }, {
+ "id": "bridge-street-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-sm",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@street-case-gap-width"
+ }
+ }, {
+ "id": "bridge-main-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 8,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["!=", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@main-case-width",
+ "line-color": "@road-case-dark",
+ "line-gap-width": "@main-width",
+ "line-translate": [0, 0]
+ }
+ }, {
+ "id": "bridge-motorway-trunk-case",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["any", ["in", "class", "motorway"], ["==", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-case-width-lg",
+ "line-color": "@road-motorway-case",
+ "line-gap-width": "@motorway-width"
+ }
+ }, {
+ "id": "bridge-motorway_link",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 10,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway_link"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway_link-width",
+ "line-color": "@road-motorway"
+ }
+ }, {
+ "id": "bridge-service-driveway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "service", "driveway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@road-width-minor",
+ "line-color": "@road-minor"
+ }
+ }, {
+ "id": "bridge-construction",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["==", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "miter"
+ },
+ "paint": {
+ "line-width": "@street_limited-width",
+ "line-color": "@road-case-dark",
+ "line-opacity": "@street-high-opacity",
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[14, [0.4, 0.8]], [15, [0.3, 0.6]], [16, [0.2, 0.3]], [17, [0.2, 0.25]], [18, [0.15, 0.15]]]
+ }
+ }
+ }, {
+ "id": "bridge-street_limited",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street_limited"], ["==", "$type", "LineString"], ["!=", "type", "construction"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street_limited-width",
+ "line-color": "@road-street-limited",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "bridge-street",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "street"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@street-width",
+ "line-color": "@road-minor",
+ "line-opacity": "@street-high-opacity"
+ }
+ }, {
+ "id": "bridge-main",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["!=", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@main-width",
+ "line-color": "@road-minor",
+ "line-opacity": "@road-high-z-fadein"
+ }
+ }, {
+ "id": "bridge-trunk",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "main"], ["==", "type", "trunk"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway-width",
+ "line-color": "@road-trunk"
+ }
+ }, {
+ "id": "bridge-motorway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "motorway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-width": "@motorway-width",
+ "line-color": "@road-motorway"
+ }
+ }, {
+ "id": "bridge-oneway-arrows-white",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "oneway", 1], ["any", ["in", "class", "motorway", "motorway_link"], ["in", "type", "trunk"]]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "symbol-placement": "line",
+ "icon-image": {
+ "base": 1,
+ "stops": [[16, "oneway-spaced-white-small"], [17, "oneway-spaced-white-large"]]
+ },
+ "icon-ignore-placement": true
+ },
+ "paint": {}
+ }, {
+ "id": "bridge-oneway-arrows-color",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "oneway", 1], ["in", "class", "main", "street", "street_limited"], ["!=", "type", "trunk"]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "symbol-placement": "line",
+ "icon-image": {
+ "base": 1,
+ "stops": [[16, "oneway-spaced-small"], [17, "oneway-spaced-large"]]
+ },
+ "icon-ignore-placement": true
+ },
+ "paint": {}
+ }, {
+ "id": "bridge-rail",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "major_rail", "minor_rail"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@rail-lowhigh",
+ "line-width": "@rail-width"
+ }
+ }, {
+ "id": "bridge-rail-tracks",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "major_rail", "minor_rail"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@rail-lowhigh",
+ "line-width": "@rail-track-width",
+ "line-dasharray": [0.1, 15],
+ "line-opacity": {
+ "base": 1,
+ "stops": [[13.75, 0], [20, 1]]
+ }
+ }
+ }, {
+ "id": "bridge-aerialway",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "bridge",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "aerialway"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-color": "@rail",
+ "line-width": "@rail-width"
+ }
+ }, {
+ "id": "hedges",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "barrier_line",
+ "minzoom": 16,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "hedge"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e2f4c2",
+ "line-width": {
+ "base": 1,
+ "stops": [[16, 1], [20, 3]]
+ },
+ "line-opacity": 1,
+ "line-dasharray": [1, 2, 5, 2, 1, 2]
+ }
+ }, {
+ "id": "fences",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "barrier_line",
+ "minzoom": 16,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "fence"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "@building-shadow",
+ "line-width": {
+ "base": 1,
+ "stops": [[16, 1], [20, 3]]
+ },
+ "line-opacity": 1,
+ "line-dasharray": [1, 2, 5, 2, 1, 2]
+ }
+ }, {
+ "id": "gates",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "barrier_line",
+ "minzoom": 17,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "gate"]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "@building-shadow",
+ "line-width": {
+ "base": 1,
+ "stops": [[16, 1], [20, 3]]
+ },
+ "line-opacity": 0.5,
+ "line-dasharray": [1, 2, 5, 2, 1, 2]
+ }
+ }, {
+ "id": "admin-2-boundaries-bg",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "admin",
+ "minzoom": 1,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "admin_level", 2], ["==", "maritime", 0]],
+ "layout": {
+ "visibility": "visible",
+ "line-join": "miter",
+ "line-cap": "butt"
+ },
+ "paint": {
+ "line-width": {
+ "base": 1,
+ "stops": [[3, 3.5], [10, 10]]
+ },
+ "line-color": {
+ "base": 1,
+ "stops": [[6, "@land"], [8, "#f6e8e1"]]
+ },
+ "line-opacity": {
+ "base": 1,
+ "stops": [[3, 0], [4, 0.5]]
+ },
+ "line-translate": [0, 0],
+ "line-blur": {
+ "base": 1,
+ "stops": [[3, 0], [10, 2]]
+ }
+ }
+ }, {
+ "id": "admin-3-4-boundaries",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "admin",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", [">=", "admin_level", 3], ["==", "maritime", 0]],
+ "layout": {
+ "visibility": "visible",
+ "line-join": "round",
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-dasharray": {
+ "base": 1,
+ "stops": [[6, [2, 0]], [7, [2, 2, 6, 2]]]
+ },
+ "line-width": {
+ "base": 1,
+ "stops": [[7, 0.75], [12, 1.5]]
+ },
+ "line-opacity": {
+ "base": 1,
+ "stops": [[2, 0], [3, 1]]
+ },
+ "line-color": {
+ "base": 1,
+ "stops": [[3, "#c3bfcc"], [7, "#aba8b3"]]
+ }
+ }
+ }, {
+ "id": "admin-2-boundaries",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "admin",
+ "minzoom": 1,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "admin_level", 2], ["==", "maritime", 0], ["==", "disputed", 0]],
+ "layout": {
+ "visibility": "visible",
+ "line-join": "round",
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "@admin",
+ "line-width": "@admin-2-boundary"
+ }
+ }, {
+ "id": "admin-2-boundaries-dispute",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "admin",
+ "minzoom": 1,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "admin_level", 2], ["==", "maritime", 0], ["==", "disputed", 1]],
+ "layout": {
+ "visibility": "visible",
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-dasharray": [1.5, 1.5],
+ "line-color": "@admin",
+ "line-width": "@admin-2-boundary"
+ }
+ }, {
+ "id": "contour",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "contour",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["!=", "index", 5]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "line-opacity": 0.07,
+ "line-color": "#66601a"
+ }
+ }, {
+ "id": "contour-index",
+ "type": "line",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "contour",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "index", 5]],
+ "layout": {
+ "visibility": "visible"
+ },
+ "paint": {
+ "line-opacity": 0.12,
+ "line-color": "#66601a"
+ }
+ }, {
+ "id": "country-label-lg",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "country_label",
+ "minzoom": 1,
+ "maxzoom": 7,
+ "filter": ["all", ["in", "scalerank", 1, 2]],
+ "layout": {
+ "text-field": "{name_en}",
+ "visibility": "visible",
+ "text-max-size": 24,
+ "text-max-width": {
+ "base": 1,
+ "stops": [[0, 5], [3, 6]]
+ },
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Bold"
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[1, 10], [6, 24]]
+ },
+ "text-color": "@label-primary",
+ "text-halo-color": {
+ "base": 1,
+ "stops": [[2, "@country-halo"], [3, "@halo"]]
+ },
+ "text-halo-width": 1.25
+ }
+ }, {
+ "id": "country-label-md",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "country_label",
+ "minzoom": 1,
+ "maxzoom": 8,
+ "filter": ["all", ["in", "scalerank", 3, 4]],
+ "layout": {
+ "text-field": {
+ "base": 1,
+ "stops": [[0, "{code}"], [2, "{name_en}"]]
+ },
+ "visibility": "visible",
+ "text-max-size": 24,
+ "text-max-width": 6,
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[3, 10], [8, 24]]
+ },
+ "text-color": "@label-primary",
+ "text-halo-color": {
+ "base": 1,
+ "stops": [[2, "@country-halo"], [3, "@halo"]]
+ },
+ "text-halo-width": 1.25
+ }
+ }, {
+ "id": "country-label-sm",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "country_label",
+ "minzoom": 1,
+ "maxzoom": 10,
+ "filter": ["all", [">=", "scalerank", 5]],
+ "layout": {
+ "text-field": "{name_en}",
+ "visibility": "visible",
+ "text-max-size": 22,
+ "text-max-width": 6,
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-size": {
+ "base": 0.9,
+ "stops": [[5, 14], [9, 22]]
+ },
+ "text-color": "@label-primary",
+ "text-halo-color": {
+ "base": 1,
+ "stops": [[2, "@country-halo"], [3, "@halo"]]
+ },
+ "text-halo-width": 1.25
+ }
+ }, {
+ "id": "state-label-lg",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "state_label",
+ "minzoom": 3,
+ "maxzoom": 7,
+ "filter": ["all", [">=", "area", 80000]],
+ "layout": {
+ "text-allow-overlap": false,
+ "text-ignore-placement": false,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[4, 10], [7, 18]]
+ },
+ "text-transform": "uppercase",
+ "text-font": "DIN Offc Pro Bold, Arial Unicode MS Regular",
+ "text-padding": 1,
+ "visibility": "visible",
+ "text-field": {
+ "base": 1,
+ "stops": [[0, "{abbr}"], [4, "{name_en}"]]
+ },
+ "text-letter-spacing": 0.15,
+ "text-max-width": 6
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[4, 10], [7, 18]]
+ },
+ "text-opacity": 1,
+ "text-color": "@label-state",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1
+ }
+ }, {
+ "id": "state-label-md",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "state_label",
+ "minzoom": 3,
+ "maxzoom": 8,
+ "filter": ["all", ["<", "area", 80000], [">=", "area", 20000]],
+ "layout": {
+ "text-allow-overlap": false,
+ "text-ignore-placement": false,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[5, 10], [8, 16]]
+ },
+ "text-transform": "uppercase",
+ "text-font": "DIN Offc Pro Bold, Arial Unicode MS Regular",
+ "visibility": "visible",
+ "text-field": {
+ "base": 1,
+ "stops": [[0, "{abbr}"], [5, "{name_en}"]]
+ },
+ "text-letter-spacing": 0.15,
+ "text-max-width": 6
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[5, 10], [8, 16]]
+ },
+ "text-opacity": 1,
+ "text-color": "@label-state",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1
+ }
+ }, {
+ "id": "state-label-sm",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "state_label",
+ "minzoom": 3,
+ "maxzoom": 9,
+ "filter": ["all", ["<", "area", 20000]],
+ "layout": {
+ "text-allow-overlap": false,
+ "text-ignore-placement": false,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[6, 10], [9, 14]]
+ },
+ "text-transform": "uppercase",
+ "text-font": "DIN Offc Pro Bold, Arial Unicode MS Regular",
+ "visibility": "visible",
+ "text-field": {
+ "base": 1,
+ "stops": [[0, "{abbr}"], [6, "{name_en}"]]
+ },
+ "text-letter-spacing": 0.15,
+ "text-max-width": 5
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[6, 10], [9, 14]]
+ },
+ "text-opacity": 1,
+ "text-color": "@label-state",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1
+ }
+ }, {
+ "id": "marine-label-lg-pt",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "marine_label",
+ "minzoom": 1,
+ "maxzoom": 4,
+ "filter": ["all", ["in", "labelrank", 1], ["==", "$type", "Point"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-width": 4,
+ "text-letter-spacing": 0.25,
+ "text-line-height": 1.5,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[1, 14], [4, 30]]
+ },
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-color": "@label-water",
+ "text-size": {
+ "base": 1,
+ "stops": [[1, 14], [4, 30]]
+ }
+ }
+ }, {
+ "id": "marine-label-lg-ln",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "marine_label",
+ "minzoom": 1,
+ "maxzoom": 4,
+ "filter": ["all", ["in", "labelrank", 1], ["==", "$type", "LineString"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-width": 4,
+ "text-letter-spacing": 0.25,
+ "text-line-height": 1.1,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[1, 14], [4, 30]]
+ },
+ "symbol-placement": "line",
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-color": "@label-water",
+ "text-size": {
+ "base": 1,
+ "stops": [[1, 14], [4, 30]]
+ }
+ }
+ }, {
+ "id": "marine-label-md-pt",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "marine_label",
+ "minzoom": 2,
+ "maxzoom": 8,
+ "filter": ["all", ["in", "labelrank", 2, 3], ["==", "$type", "Point"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-width": 5,
+ "text-letter-spacing": 0.15,
+ "text-line-height": 1.5,
+ "text-max-size": {
+ "base": 1.1,
+ "stops": [[2, 14], [5, 20]]
+ },
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-color": "@label-water",
+ "text-size": {
+ "base": 1.1,
+ "stops": [[2, 14], [5, 20]]
+ }
+ }
+ }, {
+ "id": "marine-label-md-ln",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "marine_label",
+ "minzoom": 2,
+ "maxzoom": 8,
+ "filter": ["all", ["in", "labelrank", 2, 3], ["==", "$type", "LineString"]],
+ "layout": {
+ "text-line-height": 1.1,
+ "symbol-min-distance": 250,
+ "text-max-size": 20,
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular",
+ "symbol-placement": "line",
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.15,
+ "text-max-width": 5
+ },
+ "paint": {
+ "text-color": "@label-water",
+ "text-size": {
+ "base": 1.1,
+ "stops": [[2, 12], [5, 20]]
+ }
+ }
+ }, {
+ "id": "marine-label-sm-pt",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "marine_label",
+ "minzoom": 3,
+ "maxzoom": 10,
+ "filter": ["all", [">=", "labelrank", 4], ["==", "$type", "Point"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-width": 5,
+ "text-letter-spacing": 0.1,
+ "text-line-height": 1.5,
+ "text-max-size": 20,
+ "symbol-placement": "point",
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-color": "@label-water",
+ "text-size": {
+ "base": 1,
+ "stops": [[3, 12], [6, 16]]
+ }
+ }
+ }, {
+ "id": "marine-label-sm-ln",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "marine_label",
+ "minzoom": 3,
+ "maxzoom": 10,
+ "filter": ["all", [">=", "labelrank", 4], ["==", "$type", "LineString"]],
+ "layout": {
+ "text-line-height": 1.1,
+ "symbol-min-distance": {
+ "base": 1,
+ "stops": [[4, 100], [6, 400]]
+ },
+ "text-max-size": 16,
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular",
+ "symbol-placement": "line",
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.1,
+ "text-max-width": 5
+ },
+ "paint": {
+ "text-color": "@label-water",
+ "text-size": {
+ "base": 1,
+ "stops": [[3, 12], [6, 16]]
+ }
+ }
+ }, {
+ "id": "place-city-lg-n",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 1,
+ "maxzoom": 14,
+ "filter": ["all", ["<=", "scalerank", 2], ["==", "type", "city"], ["in", "ldir", "N", "NE", "NW", "W"]],
+ "layout": {
+ "icon-image": "circle.sdf",
+ "text-max-size": "@label-city-lg-size",
+ "text-font": {
+ "base": 1,
+ "stops": [[7, "DIN Offc Pro Regular, Arial Unicode MS Regular"], [8, "DIN Offc Pro Medium, Arial Unicode MS Bold"]]
+ },
+ "visibility": "visible",
+ "text-offset": {
+ "base": 1,
+ "stops": [[7.99, [0, -0.25]], [8, [0, 0]]]
+ },
+ "text-anchor": {
+ "base": 1,
+ "stops": [[7, "bottom"], [8, "center"]]
+ },
+ "text-field": "{name_en}",
+ "text-max-width": 7,
+ "icon-max-size": 0.4
+ },
+ "paint": {
+ "text-size": "@label-city-lg-size",
+ "text-color": "@label-primary",
+ "icon-halo-blur": 1,
+ "icon-halo-color": "@halo",
+ "icon-halo-width": 1,
+ "text-opacity": 1,
+ "icon-color": "@label-primary",
+ "text-halo-color": "@halo",
+ "icon-size": 0.4,
+ "text-halo-width": 1,
+ "icon-opacity": {
+ "base": 1,
+ "stops": [[7.99, 1], [8, 0]]
+ },
+ "text-halo-blur": 1
+ }
+ }, {
+ "id": "place-city-lg-s",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 1,
+ "maxzoom": 14,
+ "filter": ["all", ["<=", "scalerank", 2], ["==", "type", "city"], ["in", "ldir", "S", "SE", "SW", "E"]],
+ "layout": {
+ "icon-image": "circle.sdf",
+ "text-max-size": "@label-city-lg-size",
+ "text-font": {
+ "base": 1,
+ "stops": [[7, "DIN Offc Pro Regular, Arial Unicode MS Regular"], [8, "DIN Offc Pro Medium, Arial Unicode MS Bold"]]
+ },
+ "visibility": "visible",
+ "text-offset": {
+ "base": 1,
+ "stops": [[7.99, [0, 0.15]], [8, [0, 0]]]
+ },
+ "text-anchor": {
+ "base": 1,
+ "stops": [[7, "top"], [8, "center"]]
+ },
+ "text-field": "{name_en}",
+ "text-max-width": 7,
+ "icon-max-size": 0.4
+ },
+ "paint": {
+ "text-size": "@label-city-lg-size",
+ "text-color": "@label-primary",
+ "icon-halo-blur": 1,
+ "icon-halo-color": "@halo",
+ "icon-halo-width": 1,
+ "icon-color": "@label-primary",
+ "text-halo-color": "@halo",
+ "icon-size": 0.4,
+ "text-halo-width": 1,
+ "icon-opacity": {
+ "base": 1,
+ "stops": [[7.99, 1], [8, 0]]
+ },
+ "text-halo-blur": 1
+ }
+ }, {
+ "id": "place-city-md-n",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 0,
+ "maxzoom": 14,
+ "filter": ["all", ["in", "scalerank", 3, 4, 5], ["==", "type", "city"], ["in", "ldir", "N", "NE", "NW", "W"]],
+ "layout": {
+ "icon-image": "circle.sdf",
+ "text-max-size": "@label-city-md-size",
+ "text-font": {
+ "base": 1,
+ "stops": [[7, "DIN Offc Pro Regular, Arial Unicode MS Regular"], [8, "DIN Offc Pro Medium, Arial Unicode MS Bold"]]
+ },
+ "visibility": "visible",
+ "text-offset": {
+ "base": 1,
+ "stops": [[7.99, [0, -0.25]], [8, [0, 0]]]
+ },
+ "text-anchor": {
+ "base": 1,
+ "stops": [[7, "bottom"], [8, "center"]]
+ },
+ "text-field": "{name_en}",
+ "text-max-width": 7,
+ "icon-max-size": 0.35
+ },
+ "paint": {
+ "text-size": "@label-city-md-size",
+ "text-color": "@label-primary",
+ "icon-halo-blur": 1,
+ "icon-halo-color": "@halo",
+ "icon-halo-width": 1,
+ "icon-color": "@label-primary",
+ "text-halo-color": "@halo",
+ "icon-size": 0.35,
+ "text-halo-width": 1,
+ "icon-opacity": {
+ "base": 1,
+ "stops": [[7.99, 1], [8, 0]]
+ },
+ "text-halo-blur": 1
+ }
+ }, {
+ "id": "place-city-md-s",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 0,
+ "maxzoom": 14,
+ "filter": ["all", ["in", "scalerank", 3, 4, 5], ["==", "type", "city"], ["in", "ldir", "S", "SE", "WW", "E"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "icon-image": "circle.sdf",
+ "text-anchor": {
+ "base": 1,
+ "stops": [[7, "top"], [8, "center"]]
+ },
+ "text-offset": {
+ "base": 1,
+ "stops": [[7.99, [0, 0.1]], [8, [0, 0]]]
+ },
+ "icon-max-size": 0.35,
+ "text-max-size": "@label-city-md-size",
+ "text-font": {
+ "base": 1,
+ "stops": [[7, "DIN Offc Pro Regular, Arial Unicode MS Regular"], [8, "DIN Offc Pro Medium, Arial Unicode MS Bold"]]
+ }
+ },
+ "paint": {
+ "icon-size": 0.35,
+ "text-size": "@label-city-md-size",
+ "text-halo-width": 1,
+ "text-halo-color": "@halo",
+ "text-color": "@label-primary",
+ "text-halo-blur": 1,
+ "icon-color": "@label-primary",
+ "icon-opacity": {
+ "base": 1,
+ "stops": [[7.99, 1], [8, 0]]
+ }
+ }
+ }, {
+ "id": "place-city-sm",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 0,
+ "maxzoom": 14,
+ "filter": ["all", ["!in", "scalerank", 0, 1, 2, 3, 4, 5], ["==", "type", "city"]],
+ "layout": {
+ "icon-image": "circle.sdf",
+ "text-max-size": {
+ "base": 1,
+ "stops": [[6, 12], [14, 22]]
+ },
+ "text-transform": "none",
+ "text-font": {
+ "base": 1,
+ "stops": [[7, "DIN Offc Pro Regular, Arial Unicode MS Regular"], [8, "DIN Offc Pro Medium, Arial Unicode MS Bold"]]
+ },
+ "visibility": "visible",
+ "text-offset": {
+ "base": 1,
+ "stops": [[7.99, [0, -0.2]], [8, [0, 0]]]
+ },
+ "text-anchor": {
+ "base": 1,
+ "stops": [[7, "bottom"], [8, "center"]]
+ },
+ "text-field": "{name_en}",
+ "text-max-width": 7,
+ "icon-max-size": 0.3
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[6, 12], [14, 22]]
+ },
+ "text-color": "@label-primary",
+ "icon-halo-blur": 1,
+ "icon-halo-color": "@halo",
+ "icon-halo-width": 1,
+ "icon-color": "@label-primary",
+ "text-halo-color": "@halo",
+ "icon-size": 0.3,
+ "text-halo-width": 1.25,
+ "icon-opacity": {
+ "base": 1,
+ "stops": [[7.99, 1], [8, 0]]
+ }
+ }
+ }, {
+ "id": "poi-islands",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "type", "Island"]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": 14,
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 0],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "center",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 7
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": {
+ "base": 1,
+ "stops": [[10, 11], [18, 16]]
+ }
+ }
+ }, {
+ "id": "place-town",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 6,
+ "maxzoom": 14,
+ "filter": ["all", ["in", "type", "town"]],
+ "layout": {
+ "icon-image": "circle.sdf",
+ "text-max-size": {
+ "base": 1,
+ "stops": [[7, 11.5], [15, 20]]
+ },
+ "text-font": {
+ "base": 1,
+ "stops": [[11, "DIN Offc Pro Regular, Arial Unicode MS Regular"], [12, "DIN Offc Pro Medium, Arial Unicode MS Bold"]]
+ },
+ "visibility": "visible",
+ "text-offset": {
+ "base": 1,
+ "stops": [[7, [0, -0.15]], [8, [0, 0]]]
+ },
+ "text-anchor": {
+ "base": 1,
+ "stops": [[7, "bottom"], [8, "center"]]
+ },
+ "text-field": "{name_en}",
+ "text-max-width": 7,
+ "icon-max-size": 0.3
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[7, 11.5], [15, 20]]
+ },
+ "text-color": "@label-primary",
+ "icon-halo-blur": 1,
+ "icon-halo-color": "@halo",
+ "icon-halo-width": 1,
+ "icon-color": "@label-primary",
+ "text-halo-color": "@halo",
+ "icon-size": 0.3,
+ "text-halo-width": 1.25,
+ "icon-opacity": {
+ "base": 1,
+ "stops": [[7.99, 1], [8, 0]]
+ }
+ }
+ }, {
+ "id": "place-village",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 8,
+ "maxzoom": 15,
+ "filter": ["all", ["in", "type", "village"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-size": {
+ "base": 1,
+ "stops": [[10, 11.5], [16, 18]]
+ },
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "text-max-width": 7
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[10, 11.5], [16, 18]]
+ },
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.25,
+ "text-color": "@label-primary"
+ }
+ }, {
+ "id": "place-hamlet",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 10,
+ "maxzoom": 16,
+ "filter": ["all", ["in", "type", "hamlet"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-size": {
+ "base": 1,
+ "stops": [[12, 11.5], [15, 16]]
+ },
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[12, 11.5], [15, 16]]
+ },
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.25,
+ "text-color": "@label-primary"
+ }
+ }, {
+ "id": "place-suburb",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 10,
+ "maxzoom": 16,
+ "filter": ["all", ["==", "type", "suburb"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-transform": "uppercase",
+ "text-max-size": {
+ "base": 1,
+ "stops": [[11, 11], [15, 18]]
+ },
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "text-letter-spacing": 0.15,
+ "text-max-width": 7,
+ "text-padding": 3
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[11, 11], [15, 18]]
+ },
+ "text-halo-color": "rgba(255,255,255, 0.5)",
+ "text-halo-width": 1.75,
+ "text-color": "@label-neighbourhood"
+ }
+ }, {
+ "id": "place-neighbourhood",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "place_label",
+ "minzoom": 10,
+ "maxzoom": 16,
+ "filter": ["all", ["in", "type", "neighbourhood"]],
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{name_en}",
+ "text-max-size": {
+ "base": 1,
+ "stops": [[12, 11], [16, 16]]
+ },
+ "text-transform": "uppercase",
+ "text-letter-spacing": 0.1,
+ "text-max-width": 7,
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "text-padding": 3
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[12, 11], [16, 16]]
+ },
+ "text-halo-color": "rgba(255,255,255, 0.5)",
+ "text-halo-width": 1.75,
+ "text-color": "@label-neighbourhood",
+ "text-halo-blur": 0
+ }
+ }, {
+ "id": "poi-islets",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "type", "Islet"]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[10, 11], [14, 16]]
+ },
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 0],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "center",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": {
+ "base": 1,
+ "stops": [[10, 11], [14, 16]]
+ }
+ }
+ }, {
+ "id": "water-label",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "water_label",
+ "minzoom": 5,
+ "maxzoom": 22,
+ "filter": ["all"],
+ "layout": {
+ "text-field": "{name_en}",
+ "visibility": "visible",
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular",
+ "text-max-width": 7,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[13, 13], [18, 18]]
+ }
+ },
+ "paint": {
+ "text-halo-width": 0,
+ "text-size": {
+ "base": 1,
+ "stops": [[13, 13], [18, 18]]
+ },
+ "text-halo-color": "@halo",
+ "text-color": "@label-water-dark",
+ "text-halo-blur": 1.5
+ }
+ }, {
+ "id": "airport-label",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 9,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "maki", "airport", "heliport", "rocket"], ["<=", "scalerank", 2]],
+ "layout": {
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": {
+ "stops": [[12, "{maki}-11"], [13, "{maki}-15"]]
+ },
+ "text-ignore-placement": false,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[10, 12], [18, 18]]
+ },
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": {
+ "base": 1,
+ "stops": [[12, [0, 1]], [13, [0, 1.25]]]
+ },
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": {
+ "stops": [[12, "{ref}"], [13, "{name_en}"]]
+ },
+ "text-letter-spacing": 0.02,
+ "text-max-width": 9
+ },
+ "paint": {
+ "text-color": "@label-transit",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.25,
+ "text-size": {
+ "base": 1,
+ "stops": [[10, 12], [18, 18]]
+ }
+ }
+ }, {
+ "id": "poi-scalerank1",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "maki", "rail-light", "rail-metro", "rail", "airport", "airfield", "heliport", "rocket", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["<=", "scalerank", 1], ["!=", "type", "Island"]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": {
+ "stops": [[13, "{maki}-11"], [14, "{maki}-15"]]
+ },
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank1",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": "@poi-scalerank1"
+ }
+ }, {
+ "id": "poi-parks-scalerank1",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "maki", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["<=", "scalerank", 1]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": {
+ "stops": [[13, "{maki}-11"], [14, "{maki}-15"]]
+ },
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank1",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-park",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-halo-blur": 0,
+ "text-size": "@poi-scalerank1"
+ }
+ }, {
+ "id": "rail-label",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 12,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "type", "Rail Station"]],
+ "layout": {
+ "symbol-min-distance": 250,
+ "icon-image": "{network}-11",
+ "symbol-avoid-edges": true,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[13, 6], [14, 11], [16, 11], [20, 13]]
+ },
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "icon-allow-overlap": false,
+ "symbol-placement": "point",
+ "text-justify": "center",
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": {
+ "base": 1,
+ "stops": [[0, ""], [13, "{name_en}"]]
+ },
+ "text-letter-spacing": 0.02,
+ "icon-padding": 0,
+ "text-max-width": 7
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.5,
+ "text-size": "@poi-scalerank3",
+ "icon-halo-width": 4,
+ "icon-halo-color": "#fff",
+ "text-opacity": {
+ "base": 1,
+ "stops": [[13.99, 0], [14, 1]]
+ }
+ }
+ }, {
+ "id": "poi-parks-scalerank2",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "maki", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["==", "scalerank", 2]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": {
+ "stops": [[14, "{maki}-11"], [15, "{maki}-15"]]
+ },
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank2",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 1.25],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-park",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.25,
+ "text-size": "@poi-scalerank2"
+ }
+ }, {
+ "id": "poi-scalerank2",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 13,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "maki", "rail-light", "rail-metro", "rail", "airport", "airfield", "heliport", "rocket", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["==", "scalerank", 2]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": {
+ "stops": [[14, "{maki}-11"], [15, "{maki}-15"]]
+ },
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank2",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 1.25],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.25,
+ "text-size": "@poi-scalerank2"
+ }
+ }, {
+ "id": "interstate_motorway_shields",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "shield", "us-interstate", "us-interstate-business", "us-interstate-duplex"], ["<=", "reflen", 6]],
+ "layout": {
+ "text-allow-overlap": false,
+ "symbol-min-distance": 1000,
+ "icon-image": {
+ "base": 1,
+ "stops": [[15, "{shield}-{reflen}-small"], [16, "{shield}-{reflen}-large"]]
+ },
+ "icon-rotation-alignment": "viewport",
+ "symbol-avoid-edges": false,
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": 11,
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": {
+ "base": 1,
+ "stops": [[10, "point"], [11, "line"]]
+ },
+ "text-padding": 20,
+ "visibility": "visible",
+ "text-rotation-alignment": "viewport",
+ "text-field": "{ref}",
+ "text-letter-spacing": 0.05,
+ "icon-padding": 20
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[16, 9], [16.01, 11]]
+ },
+ "text-color": "#fff",
+ "icon-halo-color": "rgba(0, 0, 0, 1)",
+ "icon-halo-width": 1,
+ "text-opacity": 1,
+ "icon-color": "white",
+ "text-halo-color": "@halo",
+ "text-halo-width": 0
+ }
+ }, {
+ "id": "other-motorway-shields",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "shield", "us-interstate", "us-interstate-business", "us-interstate-duplex"], ["<=", "reflen", 6]],
+ "layout": {
+ "text-allow-overlap": false,
+ "symbol-min-distance": 1000,
+ "icon-image": {
+ "base": 1,
+ "stops": [[15, "{shield}-{reflen}-small"], [16, "{shield}-{reflen}-large"]]
+ },
+ "icon-rotation-alignment": "viewport",
+ "symbol-avoid-edges": false,
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": 11,
+ "text-font": "DIN Offc Pro Bold, Arial Unicode MS Regular",
+ "symbol-placement": {
+ "base": 1,
+ "stops": [[10, "point"], [11, "line"]]
+ },
+ "text-padding": 20,
+ "visibility": "visible",
+ "text-rotation-alignment": "viewport",
+ "text-field": "{ref}",
+ "text-letter-spacing": 0.05,
+ "icon-padding": 20
+ },
+ "paint": {
+ "text-size": {
+ "base": 1,
+ "stops": [[16, 9], [16.01, 11]]
+ },
+ "text-color": "@label-road",
+ "icon-halo-color": "rgba(0, 0, 0, 1)",
+ "icon-halo-width": 1,
+ "text-opacity": 1,
+ "icon-color": "white",
+ "text-halo-color": "@halo",
+ "text-halo-width": 0
+ }
+ }, {
+ "id": "road-label-large",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road_label",
+ "minzoom": 0,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "main", "motorway"]],
+ "layout": {
+ "text-allow-overlap": false,
+ "symbol-min-distance": 500,
+ "text-ignore-placement": false,
+ "text-max-angle": 30,
+ "text-max-size": {
+ "base": 1,
+ "stops": [[9, 10], [20, 16]]
+ },
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "symbol-placement": "line",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-rotation-alignment": "map",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.01
+ },
+ "paint": {
+ "text-color": "@label-road",
+ "text-halo-color": "rgba(255,255,255, 0.75)",
+ "text-halo-width": 1,
+ "text-size": {
+ "base": 1,
+ "stops": [[9, 10], [20, 16]]
+ },
+ "text-halo-blur": 1
+ }
+ }, {
+ "id": "road-label-medium",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road_label",
+ "minzoom": 11,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "class", "street", "street_limited"], ["==", "$type", "LineString"]],
+ "layout": {
+ "symbol-min-distance": 500,
+ "text-max-angle": 30,
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "symbol-placement": "line",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-rotation-alignment": "map",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.01
+ },
+ "paint": {
+ "text-color": "@label-road",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": {
+ "base": 1,
+ "stops": [[11, 10], [20, 14]]
+ }
+ }
+ }, {
+ "id": "road-label-small",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "road_label",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "class", "motorway", "main", "street_limited", "street"], ["==", "$type", "LineString"]],
+ "layout": {
+ "symbol-min-distance": 500,
+ "text-ignore-placement": false,
+ "text-max-angle": 30,
+ "text-max-size": 12,
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular",
+ "symbol-placement": "line",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-rotation-alignment": "map",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.01
+ },
+ "paint": {
+ "text-color": "@label-road",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1.25,
+ "text-size": {
+ "base": 1,
+ "stops": [[15, 10], [20, 13]]
+ },
+ "text-halo-blur": 1
+ }
+ }, {
+ "id": "poi-parks-scalerank3",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "maki", "park", "cemetery", "golf", "zoo"], ["==", "scalerank", 3]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": "{maki}-11",
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank3",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-park",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": "@poi-scalerank3"
+ }
+ }, {
+ "id": "poi-scalerank3",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 15,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "maki", "rail-light", "rail-metro", "rail", "airport", "airfield", "heliport", "rocket", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["==", "scalerank", 3]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": "{maki}-11",
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank3",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 1,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": "@poi-scalerank3"
+ }
+ }, {
+ "id": "poi-parks_scalerank4",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 16,
+ "maxzoom": 22,
+ "filter": ["all", ["in", "maki", "park", "cemetery", "golf", "zoo", "playground", ""], ["==", "scalerank", 4]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": "{maki}-11",
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank4",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 1,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-park",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": "@poi-scalerank4"
+ }
+ }, {
+ "id": "poi-scalerank4-l1",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 16,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "maki", "rail-light", "rail-metro", "rail", "airport", "airfield", "heliport", "rocket", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["==", "scalerank", 4], ["<=", "localrank", 14]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": "{maki}-11",
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank4",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 1,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": "@poi-scalerank4"
+ }
+ }, {
+ "id": "poi-scalerank4-l15",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "poi_label",
+ "minzoom": 17,
+ "maxzoom": 22,
+ "filter": ["all", ["!in", "maki", "rail-light", "rail-metro", "rail", "airport", "airfield", "heliport", "rocket", "park", "golf", "cemetery", "zoo", "campsite", "swimming", "dog-park"], ["==", "scalerank", 4], [">=", "localrank", 15]],
+ "layout": {
+ "text-line-height": 1.2,
+ "text-allow-overlap": false,
+ "symbol-min-distance": 250,
+ "icon-image": "{maki}-11",
+ "text-ignore-placement": false,
+ "text-max-angle": 38,
+ "text-max-size": "@poi-scalerank4",
+ "text-font": "DIN Offc Pro Medium, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-padding": 2,
+ "visibility": "visible",
+ "text-offset": [0, 1],
+ "icon-optional": false,
+ "text-rotation-alignment": "viewport",
+ "text-anchor": "top",
+ "text-field": "{name_en}",
+ "text-letter-spacing": 0.02,
+ "text-max-width": 8
+ },
+ "paint": {
+ "text-color": "@label-poi",
+ "text-halo-color": "@halo",
+ "text-halo-width": 1,
+ "text-size": "@poi-scalerank4"
+ }
+ }, {
+ "id": "waterway-label",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "waterway_label",
+ "minzoom": 12,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "class", "river"]],
+ "layout": {
+ "text-field": "{name_en}",
+ "visibility": "visible",
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular",
+ "symbol-placement": "line",
+ "text-max-angle": 30
+ },
+ "paint": {
+ "text-halo-width": 0.5,
+ "text-size": {
+ "base": 1,
+ "stops": [[13, 12], [18, 16]]
+ },
+ "text-halo-color": "@halo",
+ "text-color": "@label-water-dark",
+ "text-halo-blur": 0.5
+ }
+ }, {
+ "id": "contour-index-label",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-terrain-v2",
+ "source-layer": "contour",
+ "minzoom": 14,
+ "maxzoom": 22,
+ "filter": ["all", ["==", "index", 5]],
+ "layout": {
+ "text-field": "{ele} m",
+ "symbol-placement": "line",
+ "text-max-size": 9.5,
+ "text-max-angle": 25,
+ "visibility": "visible",
+ "text-padding": 5,
+ "text-font": "DIN Offc Pro Regular, Arial Unicode MS Regular"
+ },
+ "paint": {
+ "text-size": 9.5,
+ "text-color": "#a7a696",
+ "text-halo-width": 1,
+ "text-halo-blur": 1,
+ "text-halo-color": "rgba(237,233,217, 0.25)"
+ }
+ }, {
+ "id": "housenum-label",
+ "type": "symbol",
+ "source": "mapbox://mapbox.mapbox-streets-v6",
+ "source-layer": "housenum_label",
+ "minzoom": 17,
+ "maxzoom": 22,
+ "layout": {
+ "visibility": "visible",
+ "text-field": "{house_num}",
+ "text-font": "DIN Offc Pro Italic, Arial Unicode MS Regular",
+ "symbol-placement": "point",
+ "text-max-size": 9.5,
+ "text-padding": 4,
+ "text-max-width": 7
+ },
+ "paint": {
+ "text-size": 9.5,
+ "text-color": "#b2aca5",
+ "text-halo-color": "@building",
+ "text-halo-width": 1.5,
+ "text-halo-blur": 0
+ }
+ }],
+ "owner": "nicki",
+ "modified": "2015-04-22T21:56:16.821Z",
+ "created": "2015-04-20T17:11:47.261Z",
+ "id": "nicki.be444c8f"
+} \ No newline at end of file
diff --git a/ios/benchmark/assets/tiles/download.sh b/ios/benchmark/assets/tiles/download.sh
new file mode 100755
index 0000000000..23b00f9241
--- /dev/null
+++ b/ios/benchmark/assets/tiles/download.sh
@@ -0,0 +1,175 @@
+#!/usr/bin/env bash
+
+set -u
+
+LIST=(
+ # paris
+ "mapbox.mapbox-streets-v6/11/1037/704.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1037/705.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1038/704.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1038/705.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1036/704.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1037/703.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1036/705.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1038/703.vector.pbf"
+ "mapbox.mapbox-streets-v6/11/1036/703.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1037/704.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1037/705.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1038/704.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1038/705.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1036/704.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1037/703.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1036/705.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1038/703.vector.pbf"
+ "mapbox.mapbox-terrain-v2/11/1036/703.vector.pbf"
+
+ # paris2
+ "mapbox.mapbox-streets-v6/13/4150/2819.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4149/2819.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4150/2818.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4149/2820.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4148/2819.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4149/2818.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4150/2817.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4148/2820.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4148/2818.vector.pbf"
+ "mapbox.mapbox-streets-v6/13/4149/2817.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4150/2819.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4149/2819.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4150/2818.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4149/2820.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4148/2819.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4149/2818.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4150/2817.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4148/2820.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4148/2818.vector.pbf"
+ "mapbox.mapbox-terrain-v2/13/4149/2817.vector.pbf"
+
+ # alps
+ "mapbox.mapbox-streets-v6/6/34/23.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/34/22.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/33/23.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/33/22.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/34/21.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/32/23.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/32/22.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/33/21.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/32/21.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/34/23.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/34/22.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/33/23.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/33/22.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/34/21.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/32/23.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/32/22.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/33/21.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/32/21.vector.pbf"
+
+ # us east
+ "mapbox.mapbox-streets-v6/5/9/12.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/8/12.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/9/13.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/8/13.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/9/11.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/7/12.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/8/11.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/7/13.vector.pbf"
+ "mapbox.mapbox-streets-v6/5/7/11.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/9/12.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/8/12.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/9/13.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/8/13.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/9/11.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/7/12.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/8/11.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/7/13.vector.pbf"
+ "mapbox.mapbox-terrain-v2/5/7/11.vector.pbf"
+
+ # greater la
+ "mapbox.mapbox-streets-v6/9/88/204.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/88/205.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/89/204.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/89/205.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/87/204.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/88/203.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/87/205.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/89/203.vector.pbf"
+ "mapbox.mapbox-streets-v6/9/87/203.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/88/204.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/88/205.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/89/204.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/89/205.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/87/204.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/88/203.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/87/205.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/89/203.vector.pbf"
+ "mapbox.mapbox-terrain-v2/9/87/203.vector.pbf"
+
+ # sf
+ "mapbox.mapbox-streets-v6/14/2621/6333.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2620/6333.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2621/6334.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2620/6334.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2621/6332.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2619/6333.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2620/6332.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2619/6334.vector.pbf"
+ "mapbox.mapbox-streets-v6/14/2619/6332.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2621/6333.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2620/6333.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2621/6334.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2620/6334.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2621/6332.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2619/6333.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2620/6332.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2619/6334.vector.pbf"
+ "mapbox.mapbox-terrain-v2/14/2619/6332.vector.pbf"
+
+ # oakland
+ "mapbox.mapbox-streets-v6/12/657/1582.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/657/1583.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/658/1582.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/658/1583.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/656/1582.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/657/1581.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/656/1583.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/658/1581.vector.pbf"
+ "mapbox.mapbox-streets-v6/12/656/1581.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/657/1582.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/657/1583.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/658/1582.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/658/1583.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/656/1582.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/657/1581.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/656/1583.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/658/1581.vector.pbf"
+ "mapbox.mapbox-terrain-v2/12/656/1581.vector.pbf"
+
+ # germany
+ "mapbox.mapbox-streets-v6/6/34/21.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/34/22.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/33/21.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/33/22.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/34/20.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/32/21.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/33/20.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/32/22.vector.pbf"
+ "mapbox.mapbox-streets-v6/6/32/20.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/34/21.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/34/22.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/33/21.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/33/22.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/34/20.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/32/21.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/33/20.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/32/22.vector.pbf"
+ "mapbox.mapbox-terrain-v2/6/32/20.vector.pbf"
+)
+
+for OUTPUT in ${LIST[@]} ; do
+ if [ ! -f "${OUTPUT}" ] ; then
+ mkdir -p "`dirname "${OUTPUT}"`"
+ echo "Downloading tile '${OUTPUT}'"
+ curl -# "https://a.tiles.mapbox.com/v4/${OUTPUT}?access_token=${MAPBOX_ACCESS_TOKEN}" | gunzip > "${OUTPUT}"
+ fi
+done
diff --git a/ios/benchmark/assets/tiles/mapbox.mapbox-streets-v6.json b/ios/benchmark/assets/tiles/mapbox.mapbox-streets-v6.json
new file mode 100644
index 0000000000..1d556bf6a9
--- /dev/null
+++ b/ios/benchmark/assets/tiles/mapbox.mapbox-streets-v6.json
@@ -0,0 +1 @@
+{"attribution":"<a href=\"https://www.mapbox.com/about/maps/\" target=\"_blank\">&copy; Mapbox &copy; OpenStreetMap</a> <a class=\"mapbox-improve-map\" href=\"https://www.mapbox.com/map-feedback/\" target=\"_blank\">Improve this map</a>","bounds":[-180,-85.0511,180,85.0511],"center":[0,0,0],"description":"","filesize":0,"format":"pbf","id":"mapbox.mapbox-streets-v6","maskLevel":8,"maxzoom":15,"minzoom":0,"name":"Mapbox Streets V6","private":true,"scheme":"xyz","tilejson":"2.0.0","tiles":["asset://tiles/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf"],"vector_layers":[{"description":"","fields":{"class":"One of: cemetery, hospital, industrial, park, parking, pitch, sand, school, wood","osm_id":"Unique OSM ID number","type":"OSM tag, more specific than class"},"id":"landuse"},{"description":"","fields":{"class":"One of: river, canal, stream, stream_intermittent, ditch, drain","osm_id":"Unique OSM ID number","type":"One of: river, canal, stream, ditch, drain"},"id":"waterway"},{"description":"","fields":{"osm_id":"Unique OSM ID number"},"id":"water"},{"description":"","fields":{"osm_id":"Unique OSM ID number","type":"One of: runway, taxiway, apron"},"id":"aeroway"},{"description":"","fields":{"class":"One of: fence, hedge, cliff, gate","osm_id":"Unique OSM ID number"},"id":"barrier_line"},{"description":"","fields":{"osm_id":"Unique OSM ID number"},"id":"building"},{"description":"","fields":{"class":"One of: wetland, wetland_noveg","osm_id":"Unique OSM ID number"},"id":"landuse_overlay"},{"description":"","fields":{"class":"One of: motorway, motorway_link, main, street, street_limited, service, driveway, path, major_rail, minor_rail, aerialway","layer":"Number used for ordering overlapping tunnels","oneway":"Number. Oneway roads are 1, all others are 0.","osm_id":"Unique OSM ID number","type":"The value of the tunnel's highway tag"},"id":"tunnel"},{"description":"","fields":{"class":"One of: motorway, motorway_link, main, street, street_limited, service, driveway, path, major_rail, minor_rail, aerialway","oneway":"Number. Oneway roads are 1, all others are 0.","osm_id":"Unique OSM ID number","type":"The value of the road's highway tag"},"id":"road"},{"description":"","fields":{"class":"One of: motorway, motorway_link, main, street, street_limited, service, driveway, path, major_rail, minor_rail, aerialway","layer":"Number used for ordering overlapping bridges","oneway":"Number. Oneway bridges are 1, all others are 0.","osm_id":"Unique OSM ID number","type":"The value of the bridge's highway tag"},"id":"bridge"},{"description":"","fields":{"admin_level":"The OSM administrative level of the boundary","disputed":"Number. Disputed boundaries are 1, all others are 0.","maritime":"Number. Maritime boundaries are 1, all others are 0."},"id":"admin"},{"description":"","fields":{"code":"ISO 3166-1 Alpha-2 code","name":"Local name of the country","name_de":"German name of the country","name_en":"English name of the country","name_es":"Spanish name of the country","name_fr":"French name of the country","name_ru":"Russian name of the country","name_zh":"Chinese name of the country","osm_id":"Unique OSM ID number","parent":"ISO 3166-1 Alpha-2 code of the administering/parent state, if any","scalerank":"Number, 1-6. Useful for styling text sizes.","type":"One of: country, territory, disputed territory, sar"},"id":"country_label"},{"description":"","fields":{"labelrank":"Number, 1-6. Useful for styling text sizes.","name":"Local or international name of the water body","name_de":"German name of the water body","name_en":"English name of the water body","name_es":"Spanish name of the water body","name_fr":"French name of the water body","name_ru":"Russian name of the water body","name_zh":"Chinese name of the water body","placement":"One of: point, line"},"id":"marine_label"},{"description":"","fields":{"abbr":"Abbreviated state name","area":"The area of the state in kilometers²","name":"Local name of the state","name_de":"German name of the state","name_en":"English name of the state","name_es":"Spanish name of the state","name_fr":"French name of the state","name_ru":"Russian name of the state","name_zh":"Chinese name of the state","osm_id":"Unique OSM ID number"},"id":"state_label"},{"description":"","fields":{"capital":"Admin level the city is a capital of, if any. One of: 2, 3, 4, null","ldir":"A hint for label placement at low zoom levels. One of: N, E, S, W, NE, SE, SW, NW, null","localrank":"Number. Priority relative to nearby places. Useful for limiting label density.","name":"Local name of the place","name_de":"German name of the place","name_en":"English name of the place","name_es":"Spanish name of the place","name_fr":"French name of the place","name_ru":"Russian name of the place","name_zh":"Chinese name of the place","osm_id":"Unique OSM ID number","scalerank":"Number, 0-9 or null. Useful for styling text & marker sizes.","type":"One of: city, town, village, hamlet, suburb, neighbourhood"},"id":"place_label"},{"description":"","fields":{"area":"The area of the water polygon in Mercator meters²","name":"Local name of the water body","name_de":"German name of the water body","name_en":"English name of the water body","name_es":"Spanish name of the water body","name_fr":"French name of the water body","name_ru":"Russian name of the water body","name_zh":"Chinese name of the water body","osm_id":"Unique OSM ID number"},"id":"water_label"},{"description":"","fields":{"address":"Street address of the POI","localrank":"Number. Priority relative to nearby POIs. Useful for limiting label density.","maki":"The name of the Maki icon that should be used for the POI","name":"Local name of the POI","name_de":"German name of the POI","name_en":"English name of the POI","name_es":"Spanish name of the POI","name_fr":"French name of the POI","name_ru":"Russian name of the POI","name_zh":"Chinese name of the POI","network":"For rail stations, the network(s) that the station serves. Useful for icon styling.","osm_id":"Unique OSM ID number","ref":"Short reference code, if any","scalerank":"Number. 1-4. Useful for styling icon sizes and minimum zoom levels.","type":"The original OSM tag value","website":"URL of the POI"},"id":"poi_label"},{"description":"","fields":{"class":"One of: motorway, motorway_link, main, street, street_limited, service, driveway, path","len":"Number. Length of the road segment in Mercator meters.","localrank":"Number. Used for shield points only. Priority relative to nearby shields. Useful for limiting shield density.","name":"Local name of the road","name_de":"German name of the road","name_en":"English name of the road","name_es":"Spanish name of the road","name_fr":"French name of the road","name_ru":"Russian name of the road","name_zh":"Chinese name of the road","osm_id":"Unique OSM ID number","ref":"Route number of the road","reflen":"Number. How many characters long the ref tag is. Useful for shield styling.","shield":"The shield style to use. One of: default, mx-federal, mx-state, us-highway, us-highway-alternate, us-highway-business, us-highway-duplex, us-interstate, us-interstate-business, us-interstate-duplex, us-interstate-truck, us-state"},"id":"road_label"},{"description":"","fields":{"class":"One of: river, canal, stream, stream_intermittent","name":"Local name of the waterway","name_de":"German name of the waterway","name_en":"English name of the waterway","name_es":"Spanish name of the waterway","name_fr":"French name of the waterway","name_ru":"Russian name of the waterway","name_zh":"Chinese name of the waterway","osm_id":"Unique OSM ID number","type":"One of: river, canal, stream"},"id":"waterway_label"},{"description":"","fields":{"house_num":"House number","osm_id":"Unique OSM ID number"},"id":"housenum_label"}]} \ No newline at end of file
diff --git a/ios/benchmark/assets/tiles/mapbox.mapbox-terrain-v2.json b/ios/benchmark/assets/tiles/mapbox.mapbox-terrain-v2.json
new file mode 100644
index 0000000000..4ee001abd1
--- /dev/null
+++ b/ios/benchmark/assets/tiles/mapbox.mapbox-terrain-v2.json
@@ -0,0 +1 @@
+{"attribution":"<a href=\"https://www.mapbox.com/about/maps/\" target=\"_blank\">&copy; Mapbox &copy; OpenStreetMap</a> <a class=\"mapbox-improve-map\" href=\"https://www.mapbox.com/map-feedback/\" target=\"_blank\">Improve this map</a>","bounds":[-180,-85.0511,180,85.0511],"center":[0,0,3],"description":"","filesize":0,"format":"pbf","id":"mapbox.mapbox-terrain-v2","maskLevel":9,"maxzoom":14,"minzoom":0,"name":"Mapbox Terrain V2","private":true,"scheme":"xyz","tilejson":"2.0.0","tiles":["asset://tiles/mapbox.mapbox-terrain-v2/{z}/{x}/{y}.vector.pbf"],"vector_layers":[{"description":"Generalized landcover classification","fields":{"class":"One of: wood, scrub, grass, crop, snow"},"id":"landcover","maxzoom":22,"minzoom":0},{"description":"","fields":{"class":"One of: shadow, highlight","level":"Brightness %. One of: 94, 90, 89, 78, 67, 56"},"id":"hillshade","maxzoom":22,"minzoom":0},{"description":"Elevation contour polygons","fields":{"ele":"Integer. The elevation of the contour in meters.","index":"Indicator for every 2nd, 5th, or 10th contour. Coastlines are given -1. One of: 2, 5, 10, -1, null"},"id":"contour","maxzoom":22,"minzoom":0}]} \ No newline at end of file
diff --git a/ios/benchmark/benchmark-ios.gypi b/ios/benchmark/benchmark-ios.gypi
new file mode 100644
index 0000000000..0a3440d5cd
--- /dev/null
+++ b/ios/benchmark/benchmark-ios.gypi
@@ -0,0 +1,63 @@
+{
+ 'includes': [
+ '../../gyp/common.gypi',
+ ],
+ 'targets': [
+ { 'target_name': 'ios-bench',
+ 'product_name': 'Bench GL',
+ 'type': 'executable',
+ 'product_extension': 'app',
+ 'mac_bundle': 1,
+ 'mac_bundle_resources': [
+ '<!@(find ../ios/benchmark/img -type f)',
+ 'assets/glyphs',
+ 'assets/sprites',
+ 'assets/styles',
+ 'assets/tiles',
+ ],
+
+ 'dependencies': [
+ '../mbgl.gyp:core',
+ '../mbgl.gyp:platform-<(platform_lib)',
+ '../mbgl.gyp:http-<(http_lib)',
+ '../mbgl.gyp:asset-<(asset_lib)',
+ '../mbgl.gyp:cache-<(cache_lib)',
+ ],
+
+ 'sources': [
+ './main.m',
+ './MBXBenchAppDelegate.h',
+ './MBXBenchAppDelegate.m',
+ './MBXBenchViewController.h',
+ './MBXBenchViewController.mm',
+ './locations.hpp',
+ './locations.cpp',
+ ],
+
+ 'xcode_settings': {
+ 'SDKROOT': 'iphoneos',
+ 'SUPPORTED_PLATFORMS': 'iphoneos',
+ 'IPHONEOS_DEPLOYMENT_TARGET': '7.0',
+ 'INFOPLIST_FILE': '../ios/benchmark/app-info.plist',
+ 'TARGETED_DEVICE_FAMILY': '1,2',
+ 'COMBINE_HIDPI_IMAGES': 'NO', # don't merge @2x.png images into .tiff files
+ 'CLANG_ENABLE_OBJC_ARC': 'YES',
+ 'CLANG_ENABLE_MODULES': 'YES',
+ },
+
+ 'configurations': {
+ 'Debug': {
+ 'xcode_settings': {
+ 'CODE_SIGN_IDENTITY': 'iPhone Developer',
+ },
+ },
+ 'Release': {
+ 'xcode_settings': {
+ 'CODE_SIGN_IDENTITY': 'iPhone Distribution',
+ 'ARCHS': [ "arm64" ],
+ },
+ },
+ },
+ }
+ ]
+}
diff --git a/ios/benchmark/fo/MBXBenchViewController.mm b/ios/benchmark/fo/MBXBenchViewController.mm
new file mode 100644
index 0000000000..f1079d9e08
--- /dev/null
+++ b/ios/benchmark/fo/MBXBenchViewController.mm
@@ -0,0 +1,140 @@
+#import "MBXBenchViewController.h"
+
+#import <mbgl/ios/MGLMapView.h>
+#import <mbgl/ios/MGLMapView_private.h>
+
+#include "locations.hpp"
+
+#include <chrono>
+
+@interface MBXBenchViewController () <MGLMapViewDelegate>
+
+@property (nonatomic) MGLMapView *mapView;
+
+@end
+
+@implementation MBXBenchViewController
+
+#pragma mark - Setup
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ NSURL* url = [[NSURL alloc] initWithString:@"asset://styles/mapbox-streets-v7.json"];
+ self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds accessToken:nil styleURL:url];
+ self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ self.mapView.delegate = self;
+ self.mapView.zoomEnabled = NO;
+ self.mapView.scrollEnabled = NO;
+ self.mapView.rotateEnabled = NO;
+ self.mapView.userInteractionEnabled = YES;
+ [self.mapView setDebugActive:NO];
+
+ [self startBenchmarkIteration];
+
+ [self.view addSubview:self.mapView];
+
+}
+
+using Clock = std::chrono::steady_clock;
+using TimePoint = Clock::time_point;
+template <typename Duration>
+inline int64_t Microseconds(Duration d) {
+ return std::chrono::duration_cast<std::chrono::microseconds>(d).count();
+}
+
+size_t idx = 0;
+enum class State { None, WaitingForAssets, WarmingUp, Benchmarking } state = State::None;
+int frames = 0;
+TimePoint started;
+std::vector<std::pair<std::string, double>> result;
+
+static const int warmupDuration = 20; // frames
+static const int benchmarkDuration = 200; // frames
+
+- (void)startBenchmarkIteration
+{
+ if (mbgl::bench::locations.size() > idx) {
+ const auto& location = mbgl::bench::locations[idx];
+ [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(location.latitude, location.longitude) zoomLevel:location.zoom animated:NO];
+ self.mapView.direction = location.bearing;
+ state = State::WaitingForAssets;
+ NSLog(@"Benchmarking \"%s\"", location.name.c_str());
+ NSLog(@"- Loading assets...");
+ } else {
+ // Do nothing. The benchmark is completed.
+ NSLog(@"Benchmark completed.");
+ NSLog(@"Result:");
+ size_t colWidth = 0;
+ for (const auto& row : result) {
+ colWidth = std::max(row.first.size(), colWidth);
+ }
+ for (const auto& row : result) {
+ NSLog(@"| %-*s | %4.1f fps |", int(colWidth), row.first.c_str(), row.second);
+ }
+ exit(0);
+ }
+}
+
+- (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered
+{
+ (void)mapView;
+ (void)fullyRendered;
+
+ if (state == State::Benchmarking)
+ {
+ frames++;
+ if (frames >= benchmarkDuration)
+ {
+ state = State::None;
+
+ // Report FPS
+ const auto duration = Microseconds(Clock::now() - started);
+ const auto fps = double(frames * 1e6) / duration;
+ result.emplace_back(mbgl::bench::locations[idx].name, fps);
+ NSLog(@"- FPS: %.1f", fps);
+
+ // Start benchmarking the next location.
+ idx++;
+ [self startBenchmarkIteration];
+ } else {
+ [mapView invalidate];
+ }
+ return;
+ }
+
+ else if (state == State::WarmingUp)
+ {
+ frames++;
+ if (frames >= warmupDuration)
+ {
+ frames = 0;
+ state = State::Benchmarking;
+ started = Clock::now();
+ NSLog(@"- Benchmarking for %d frames...", benchmarkDuration);
+ }
+ [mapView invalidate];
+ return;
+ }
+
+ else if (state == State::WaitingForAssets)
+ {
+ if ([mapView isFullyLoaded])
+ {
+ // Start the benchmarking timer.
+ state = State::WarmingUp;
+ [self.mapView emptyMemoryCache];
+ NSLog(@"- Warming up for %d frames...", warmupDuration);
+ [mapView invalidate];
+ }
+ return;
+ }
+}
+
+- (NSUInteger)supportedInterfaceOrientations
+{
+ return UIInterfaceOrientationMaskLandscape;
+}
+
+@end
diff --git a/ios/benchmark/fo/benchmark-ios.gypi b/ios/benchmark/fo/benchmark-ios.gypi
new file mode 100644
index 0000000000..ff004add53
--- /dev/null
+++ b/ios/benchmark/fo/benchmark-ios.gypi
@@ -0,0 +1,64 @@
+{
+ 'includes': [
+ '../../gyp/common.gypi',
+ ],
+ 'targets': [
+ { 'target_name': 'ios-bench',
+ 'product_name': 'Bench GL',
+ 'type': 'executable',
+ 'product_extension': 'app',
+ 'mac_bundle': 1,
+ 'mac_bundle_resources': [
+ '<!@(find ../ios/benchmark/img -type f)',
+ 'assets/glyphs',
+ 'assets/sprites',
+ 'assets/styles',
+ 'assets/tiles',
+ ],
+
+ 'dependencies': [
+ '../mbgl.gyp:core',
+ '../mbgl.gyp:platform-<(platform_lib)',
+ '../mbgl.gyp:http-<(http_lib)',
+ '../mbgl.gyp:asset-<(asset_lib)',
+ '../mbgl.gyp:cache-<(cache_lib)',
+ ],
+
+ 'sources': [
+ './main.m',
+ '../../include/mbgl/ios/MGLMapView_private.h',
+ './MBXBenchAppDelegate.h',
+ './MBXBenchAppDelegate.m',
+ './MBXBenchViewController.h',
+ './MBXBenchViewController.mm',
+ './locations.hpp',
+ './locations.cpp',
+ ],
+
+ 'xcode_settings': {
+ 'SDKROOT': 'iphoneos',
+ 'SUPPORTED_PLATFORMS': 'iphoneos',
+ 'IPHONEOS_DEPLOYMENT_TARGET': '7.0',
+ 'INFOPLIST_FILE': '../ios/benchmark/app-info.plist',
+ 'TARGETED_DEVICE_FAMILY': '1,2',
+ 'COMBINE_HIDPI_IMAGES': 'NO', # don't merge @2x.png images into .tiff files
+ 'CLANG_ENABLE_OBJC_ARC': 'YES',
+ 'CLANG_ENABLE_MODULES': 'YES',
+ },
+
+ 'configurations': {
+ 'Debug': {
+ 'xcode_settings': {
+ 'CODE_SIGN_IDENTITY': 'iPhone Developer',
+ },
+ },
+ 'Release': {
+ 'xcode_settings': {
+ 'CODE_SIGN_IDENTITY': 'iPhone Distribution',
+ 'ARCHS': [ "arm64" ],
+ },
+ },
+ },
+ }
+ ]
+}
diff --git a/ios/benchmark/img/Icon-40.png b/ios/benchmark/img/Icon-40.png
new file mode 100644
index 0000000000..2425133189
--- /dev/null
+++ b/ios/benchmark/img/Icon-40.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-40@2x.png b/ios/benchmark/img/Icon-40@2x.png
new file mode 100644
index 0000000000..b827b1e5a1
--- /dev/null
+++ b/ios/benchmark/img/Icon-40@2x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-40@3x.png b/ios/benchmark/img/Icon-40@3x.png
new file mode 100644
index 0000000000..89c7119ac6
--- /dev/null
+++ b/ios/benchmark/img/Icon-40@3x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-60.png b/ios/benchmark/img/Icon-60.png
new file mode 100644
index 0000000000..409fad814a
--- /dev/null
+++ b/ios/benchmark/img/Icon-60.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-60@2x.png b/ios/benchmark/img/Icon-60@2x.png
new file mode 100644
index 0000000000..89c7119ac6
--- /dev/null
+++ b/ios/benchmark/img/Icon-60@2x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-60@3x.png b/ios/benchmark/img/Icon-60@3x.png
new file mode 100644
index 0000000000..158bcfe27e
--- /dev/null
+++ b/ios/benchmark/img/Icon-60@3x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-72.png b/ios/benchmark/img/Icon-72.png
new file mode 100644
index 0000000000..eecd90b5eb
--- /dev/null
+++ b/ios/benchmark/img/Icon-72.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-72@2x.png b/ios/benchmark/img/Icon-72@2x.png
new file mode 100644
index 0000000000..ca28d1fa05
--- /dev/null
+++ b/ios/benchmark/img/Icon-72@2x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-76.png b/ios/benchmark/img/Icon-76.png
new file mode 100644
index 0000000000..0ed2a26730
--- /dev/null
+++ b/ios/benchmark/img/Icon-76.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-76@2x.png b/ios/benchmark/img/Icon-76@2x.png
new file mode 100644
index 0000000000..311a1658a8
--- /dev/null
+++ b/ios/benchmark/img/Icon-76@2x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-Small-50.png b/ios/benchmark/img/Icon-Small-50.png
new file mode 100644
index 0000000000..a071034743
--- /dev/null
+++ b/ios/benchmark/img/Icon-Small-50.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-Small-50@2x.png b/ios/benchmark/img/Icon-Small-50@2x.png
new file mode 100644
index 0000000000..5d7c76d5e2
--- /dev/null
+++ b/ios/benchmark/img/Icon-Small-50@2x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-Small.png b/ios/benchmark/img/Icon-Small.png
new file mode 100644
index 0000000000..630d7c04c6
--- /dev/null
+++ b/ios/benchmark/img/Icon-Small.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-Small@2x.png b/ios/benchmark/img/Icon-Small@2x.png
new file mode 100644
index 0000000000..c0ee89211a
--- /dev/null
+++ b/ios/benchmark/img/Icon-Small@2x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon-Small@3x.png b/ios/benchmark/img/Icon-Small@3x.png
new file mode 100644
index 0000000000..436a8b404c
--- /dev/null
+++ b/ios/benchmark/img/Icon-Small@3x.png
Binary files differ
diff --git a/ios/benchmark/img/Icon.png b/ios/benchmark/img/Icon.png
new file mode 100644
index 0000000000..7af0c68a38
--- /dev/null
+++ b/ios/benchmark/img/Icon.png
Binary files differ
diff --git a/ios/benchmark/img/Icon.svg b/ios/benchmark/img/Icon.svg
new file mode 100644
index 0000000000..28df6f600d
--- /dev/null
+++ b/ios/benchmark/img/Icon.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="100%" height="100%" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-miterlimit:1.41421;">
+ <image x="0" y="0" width="15px" height="15px" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAQ0lEQVQokcXP2wkAIAxD0Sidvqu5jhTxVXdIPsz/4ZLi3hLkKgsBwOjsX3zBcztKeSvllQKeSlnCQ8GhfA5cHvfk8QNc8hvDN5gIKwAAAABJRU5ErkJggg=="/>
+ <path id="path7143" d="M9.48355,2.89095C8.18827,3.22425 6.67888,4.56018 5.90484,6.38831L4.93731,6.63727C4.23814,6.81719 3.97174,7.44212 3.83781,8.06502L3.65856,8.89868L5.40366,8.44963L7.68238,9.79563L8.13143,11.5407L8.77503,10.9814C9.25592,10.5634 9.67465,10.0284 9.49474,9.32928L9.24577,8.36174C10.4732,6.80143 10.9147,4.8347 10.5814,3.53941L10.3567,2.66627L9.48355,2.89095ZM8.40657,5.10044C8.73798,5.01516 9.08086,5.2177 9.16614,5.54911C9.25142,5.88052 9.04888,6.2234 8.71747,6.30868C8.38606,6.39396 8.04318,6.19142 7.9579,5.86001C7.87262,5.5286 8.07516,5.18572 8.40657,5.10044L8.40657,5.10044ZM5.41251,9.7356L5.18818,10.1154C4.86414,10.664 4.97269,11.7811 4.97269,11.7811C4.97269,11.7811 5.9677,11.3976 6.32753,10.7884L6.55187,10.4086L5.41251,9.7356Z" style="fill:white;fill-rule:nonzero;stroke-width:0.62px;stroke:white;"/>
+</svg>
diff --git a/ios/benchmark/img/Icon@2x.png b/ios/benchmark/img/Icon@2x.png
new file mode 100644
index 0000000000..ff5ea0c073
--- /dev/null
+++ b/ios/benchmark/img/Icon@2x.png
Binary files differ
diff --git a/ios/benchmark/img/iTunesArtwork.png b/ios/benchmark/img/iTunesArtwork.png
new file mode 100644
index 0000000000..f87c8734b5
--- /dev/null
+++ b/ios/benchmark/img/iTunesArtwork.png
Binary files differ
diff --git a/ios/benchmark/img/iTunesArtwork@2x.png b/ios/benchmark/img/iTunesArtwork@2x.png
new file mode 100644
index 0000000000..8d456a126f
--- /dev/null
+++ b/ios/benchmark/img/iTunesArtwork@2x.png
Binary files differ
diff --git a/ios/benchmark/locations.cpp b/ios/benchmark/locations.cpp
new file mode 100644
index 0000000000..9f53877e40
--- /dev/null
+++ b/ios/benchmark/locations.cpp
@@ -0,0 +1,18 @@
+#include "locations.hpp"
+
+namespace mbgl {
+namespace bench {
+
+const std::vector<Location> locations = {
+ { "paris", 2.3411, 48.8664, 11, 0.0 },
+ { "paris2", 2.3516, 48.8356, 13, 273.8 },
+ { "alps", 10.6107, 46.9599, 6, 0.0 },
+ { "us east", -84.3395, 36.9400, 5, 0.0 },
+ { "greater la", -117.9529, 34.0259, 9, 0.0 },
+ { "sf", -122.4202, 37.7625, 14, 0.0 },
+ { "oakland", -122.2328, 37.8267, 12, 0.0 },
+ { "germany", 9.2280, 50.9262, 6, 0.0 },
+};
+
+}
+}
diff --git a/ios/benchmark/locations.hpp b/ios/benchmark/locations.hpp
new file mode 100644
index 0000000000..96f9c6025b
--- /dev/null
+++ b/ios/benchmark/locations.hpp
@@ -0,0 +1,23 @@
+#ifndef MBGL_BENCH_LOCATIONS
+#define MBGL_BENCH_LOCATIONS
+
+#include <vector>
+#include <string>
+
+namespace mbgl {
+namespace bench {
+
+struct Location {
+ const std::string name;
+ const double longitude;
+ const double latitude;
+ const double zoom;
+ const double bearing;
+};
+
+extern const std::vector<Location> locations;
+
+}
+}
+
+#endif \ No newline at end of file
diff --git a/ios/benchmark/main.m b/ios/benchmark/main.m
new file mode 100644
index 0000000000..52bb445552
--- /dev/null
+++ b/ios/benchmark/main.m
@@ -0,0 +1,10 @@
+#import <UIKit/UIKit.h>
+
+#import "MBXBenchAppDelegate.h"
+
+int main(int argc, char * argv[])
+{
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([MBXBenchAppDelegate class]));
+ }
+}
diff --git a/scripts/ios/benchmark.sh b/scripts/ios/benchmark.sh
new file mode 100755
index 0000000000..1c342e6533
--- /dev/null
+++ b/scripts/ios/benchmark.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+set -e
+set -o pipefail
+set -u
+
+if [ -z "$(which ios-deploy)" ] ; then
+ npm install -g ios-deploy
+fi
+
+(cd ios/benchmark/assets/tiles && ./download.sh)
+(cd ios/benchmark/assets/glyphs && ./download.sh)
+
+make ibench
+
+ios-deploy --debug --noninteractive --bundle "gyp/build/Release-iphoneos/Bench GL.app"