diff options
author | malwoodsantoro <mallorywood413@gmail.com> | 2019-07-10 10:50:20 -0700 |
---|---|---|
committer | malwoodsantoro <mallorywood413@gmail.com> | 2019-07-10 10:50:20 -0700 |
commit | a2115c086f40007aca016cef5f5c99284728fa17 (patch) | |
tree | 7acb162a76376d02c33d321952ffabbd81fe4e73 | |
parent | 6b1fb1a1dbff55472511f08167b915b0925e1ea3 (diff) | |
download | qtlocation-mapboxgl-a2115c086f40007aca016cef5f5c99284728fa17.tar.gz |
add relevant code
107 files changed, 17390 insertions, 109 deletions
diff --git a/.gradle/4.10/fileChanges/last-build.bin b/.gradle/4.10/fileChanges/last-build.bin Binary files differnew file mode 100644 index 0000000000..f76dd238ad --- /dev/null +++ b/.gradle/4.10/fileChanges/last-build.bin diff --git a/.gradle/4.10/fileHashes/fileHashes.bin b/.gradle/4.10/fileHashes/fileHashes.bin Binary files differnew file mode 100644 index 0000000000..4f428865e4 --- /dev/null +++ b/.gradle/4.10/fileHashes/fileHashes.bin diff --git a/.gradle/4.10/fileHashes/fileHashes.lock b/.gradle/4.10/fileHashes/fileHashes.lock Binary files differnew file mode 100644 index 0000000000..726fe1e835 --- /dev/null +++ b/.gradle/4.10/fileHashes/fileHashes.lock diff --git a/.gradle/4.10/gc.properties b/.gradle/4.10/gc.properties new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/.gradle/4.10/gc.properties diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/.gradle/vcs-1/gc.properties diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000000..15a15b218a --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding" addBOMForNewFiles="with NO BOM" /> +</project>
\ No newline at end of file diff --git a/.idea/mapbox-gl-native.iml b/.idea/mapbox-gl-native.iml new file mode 100644 index 0000000000..d6ebd48059 --- /dev/null +++ b/.idea/mapbox-gl-native.iml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module>
\ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..0edba4b304 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/mapbox-gl-native.iml" filepath="$PROJECT_DIR$/.idea/mapbox-gl-native.iml" /> + </modules> + </component> +</project>
\ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..a45003be62 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="" vcs="Git" /> + <mapping directory="$PROJECT_DIR$/mapbox-gl-js" vcs="Git" /> + <mapping directory="$PROJECT_DIR$/platform/darwin/docs/theme" vcs="Git" /> + </component> +</project>
\ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000000..10693b7502 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,324 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ChangeListManager"> + <list default="true" id="b355d706-609c-4fe3-845c-a284d8352edf" name="Default Changelist" comment=""> + <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/.gitignore" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/.idea/vcs.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/build.gradle" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/proguard-rules.pro" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/AndroidManifest.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/layout/activity_main.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/mipmap-hdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/mipmap-mdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/mipmap-xhdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/mipmap-xxhdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/values/dimens.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/mapbox/src/main/res/values/strings.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/settings.gradle" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/mapbox-gl-js" beforeDir="false" afterPath="$PROJECT_DIR$/mapbox-gl-js" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/mapbox-gl-js/test/integration/render-tests/text-halo-color/function/style.json" beforeDir="false" afterPath="$PROJECT_DIR$/mapbox-gl-js/test/integration/render-tests/text-halo-color/function/style.json" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/platform/android/MapboxGLAndroidSDKTestApp/src/main/assets/small_poly.geojson" beforeDir="false" /> + <change beforePath="$PROJECT_DIR$/vendor/mvt-fixtures" beforeDir="false" afterPath="$PROJECT_DIR$/vendor/mvt-fixtures" afterDir="false" /> + </list> + <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="FileEditorManager"> + <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> + <file pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/settings.gradle"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="15"> + <caret line="1" selection-start-line="1" selection-end-line="1" /> + </state> + </provider> + </entry> + </file> + <file pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/res/layout/activity_main.xml"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + </file> + <file pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MainActivity.kt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="225"> + <caret line="34" column="40" selection-start-line="34" selection-start-column="40" selection-end-line="34" selection-end-column="40" /> + </state> + </provider> + </entry> + </file> + <file pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MainActivityModule.kt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="75"> + <caret line="6" column="15" selection-start-line="6" selection-start-column="15" selection-end-line="6" selection-end-column="15" /> + </state> + </provider> + </entry> + </file> + <file pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MapboxApp.kt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="45"> + <caret line="4" selection-start-line="4" selection-end-line="4" /> + </state> + </provider> + </entry> + </file> + </leaf> + </component> + <component name="Git.Settings"> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> + </component> + <component name="IdeDocumentHistory"> + <option name="CHANGED_PATHS"> + <list> + <option value="$PROJECT_DIR$/myapplication/src/main/java/com/example/myapplication/MainActivity.kt" /> + <option value="$PROJECT_DIR$/myapplication/src/main/java/com/example/myapplication/MapboxApp.kt" /> + <option value="$PROJECT_DIR$/myapplication/src/main/java/com/example/myapplication/MainActivityModule.kt" /> + <option value="$PROJECT_DIR$/settings.gradle" /> + </list> + </option> + </component> + <component name="ProjectFrameBounds"> + <option name="x" value="-2270" /> + <option name="y" value="-313" /> + <option name="width" value="1995" /> + <option name="height" value="1268" /> + </component> + <component name="ProjectLevelVcsManager" settingsEditedManually="true" /> + <component name="ProjectView"> + <navigator currentView="ProjectPane" proportions="" version="1"> + <foldersAlwaysOnTop value="true" /> + </navigator> + <panes> + <pane id="ProjectPane"> + <subPane> + <expand> + <path> + <item name="mapbox-gl-native" type="b2602c69:ProjectViewProjectNode" /> + <item name="mapbox-gl-native" type="462c0819:PsiDirectoryNode" /> + </path> + </expand> + <select /> + </subPane> + </pane> + <pane id="PackagesPane" /> + <pane id="Scope" /> + </panes> + </component> + <component name="PropertiesComponent"> + <property name="android.sdk.path" value="$USER_HOME$/Library/Android/sdk" /> + <property name="jdk.selected.JAVA_MODULE" value="1.8" /> + <property name="last_opened_file_path" value="$PROJECT_DIR$" /> + <property name="project.structure.last.edited" value="Modules" /> + <property name="project.structure.proportion" value="0.15" /> + <property name="project.structure.side.proportion" value="0.2" /> + <property name="settings.editor.selected.configurable" value="AndroidSdkUpdater" /> + </component> + <component name="RunDashboard"> + <option name="ruleStates"> + <list> + <RuleState> + <option name="name" value="ConfigurationTypeDashboardGroupingRule" /> + </RuleState> + <RuleState> + <option name="name" value="StatusDashboardGroupingRule" /> + </RuleState> + </list> + </option> + </component> + <component name="SvnConfiguration"> + <configuration /> + </component> + <component name="TaskManager"> + <task active="true" id="Default" summary="Default task"> + <changelist id="b355d706-609c-4fe3-845c-a284d8352edf" name="Default Changelist" comment="" /> + <created>1561782410022</created> + <option name="number" value="Default" /> + <option name="presentableId" value="Default" /> + <updated>1561782410022</updated> + </task> + <servers /> + </component> + <component name="ToolWindowManager"> + <frame x="-2270" y="-313" width="1995" height="1268" extended-state="0" /> + <layout> + <window_info id="Captures" order="0" weight="0.25" /> + <window_info active="true" content_ui="combo" id="Project" order="1" visible="true" weight="0.21175279" /> + <window_info id="Structure" order="2" side_tool="true" /> + <window_info id="Image Layers" order="3" /> + <window_info id="Designer" order="4" /> + <window_info id="Resources Explorer" order="5" /> + <window_info id="Capture Tool" order="6" /> + <window_info id="Favorites" order="7" side_tool="true" /> + <window_info anchor="bottom" id="Version Control" order="0" /> + <window_info anchor="bottom" id="TODO" order="1" /> + <window_info anchor="bottom" id="Terminal" order="2" /> + <window_info anchor="bottom" id="Event Log" order="3" sideWeight="0.50076807" side_tool="true" visible="true" weight="0.26360545" /> + <window_info active="true" anchor="bottom" id="Messages" order="4" sideWeight="0.49923196" visible="true" weight="0.32905984" /> + <window_info anchor="right" id="Capture Analysis" order="0" /> + <window_info anchor="right" id="Theme Preview" order="1" /> + <window_info anchor="right" id="Preview" order="2" weight="0.18032786" /> + <window_info anchor="right" id="Palette	" order="3" /> + </layout> + </component> + <component name="editorHistoryManager"> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/myapplication/MapboxApp.kt" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/myapplication/MainActivity.kt" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/myapplication/MainActivityModule.kt" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/res/layout/activity_main.xml" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/mapbox/breadcrumb/ExerciseEngineState.kt" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/mapbox/breadcrumb/Breadcrumb.kt" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/mapbox/MainActivity.kt" /> + <entry file="file://$PROJECT_DIR$/myapplication/src/main/java/com/example/mapbox/MainActivityModule.kt" /> + <entry file="file://$PROJECT_DIR$/mapbox/gradle.properties" /> + <entry file="file://$PROJECT_DIR$/mapbox/settings.gradle" /> + <entry file="file://$PROJECT_DIR$/mapbox/local.properties"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/gradlew"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="109"> + <caret line="162" lean-forward="true" selection-start-line="162" selection-end-line="162" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MainActivity.java" /> + <entry file="file://$PROJECT_DIR$/mapbox/gradlew.bat"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/build.gradle"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="360"> + <caret line="24" column="1" selection-start-line="24" selection-start-column="1" selection-end-line="24" selection-end-column="1" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/platform/android/build.gradle"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="218"> + <caret line="18" column="1" selection-start-line="18" selection-start-column="1" selection-end-line="18" selection-end-column="1" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/platform/android/wearapp/build.gradle"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="237"> + <caret line="26" column="25" selection-start-line="26" selection-start-column="25" selection-end-line="26" selection-end-column="25" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/settings.gradle"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="15"> + <caret line="1" selection-start-line="1" selection-end-line="1" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/res/layout/activity_main.xml"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MainActivity.kt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="225"> + <caret line="34" column="40" selection-start-line="34" selection-start-column="40" selection-end-line="34" selection-end-column="40" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MainActivityModule.kt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="75"> + <caret line="6" column="15" selection-start-line="6" selection-start-column="15" selection-end-line="6" selection-end-column="15" /> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/mapbox/src/main/java/com/example/mapbox/MapboxApp.kt"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="45"> + <caret line="4" selection-start-line="4" selection-end-line="4" /> + </state> + </provider> + </entry> + </component> + <component name="masterDetails"> + <states> + <state key="ArtifactsStructureConfigurable.UI"> + <settings> + <artifact-editor /> + <splitter-proportions> + <option name="proportions"> + <list> + <option value="0.2" /> + </list> + </option> + </splitter-proportions> + </settings> + </state> + <state key="FacetStructureConfigurable.UI"> + <settings> + <last-edited>No facets are configured</last-edited> + <splitter-proportions> + <option name="proportions"> + <list> + <option value="0.2" /> + </list> + </option> + </splitter-proportions> + </settings> + </state> + <state key="GlobalLibrariesConfigurable.UI"> + <settings> + <splitter-proportions> + <option name="proportions"> + <list> + <option value="0.2" /> + </list> + </option> + </splitter-proportions> + </settings> + </state> + <state key="JdkListConfigurable.UI"> + <settings> + <last-edited>1.8</last-edited> + <splitter-proportions> + <option name="proportions"> + <list> + <option value="0.2" /> + </list> + </option> + </splitter-proportions> + </settings> + </state> + <state key="ModuleStructureConfigurable.UI"> + <settings> + <last-edited>mapbox-gl-native</last-edited> + <splitter-proportions> + <option name="proportions"> + <list> + <option value="0.2" /> + <option value="0.6" /> + </list> + </option> + </splitter-proportions> + </settings> + </state> + <state key="ProjectLibrariesConfigurable.UI"> + <settings> + <splitter-proportions> + <option name="proportions"> + <list> + <option value="0.2" /> + </list> + </option> + </splitter-proportions> + </settings> + </state> + </states> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/.gitignore b/mapbox/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/mapbox/.gitignore @@ -0,0 +1 @@ +/build diff --git a/mapbox/.idea/encodings.xml b/mapbox/.idea/encodings.xml new file mode 100644 index 0000000000..15a15b218a --- /dev/null +++ b/mapbox/.idea/encodings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding" addBOMForNewFiles="with NO BOM" /> +</project>
\ No newline at end of file diff --git a/mapbox/.idea/gradle.xml b/mapbox/.idea/gradle.xml new file mode 100644 index 0000000000..76a4349cfb --- /dev/null +++ b/mapbox/.idea/gradle.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GradleSettings"> + <option name="linkedExternalProjectsSettings"> + <GradleProjectSettings> + <option name="distributionType" value="DEFAULT_WRAPPED" /> + <option name="externalProjectPath" value="$PROJECT_DIR$" /> + <option name="resolveModulePerSourceSet" value="false" /> + </GradleProjectSettings> + </option> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/.idea/misc.xml b/mapbox/.idea/misc.xml new file mode 100644 index 0000000000..48725873bd --- /dev/null +++ b/mapbox/.idea/misc.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectRootManager"> + <output url="file://$PROJECT_DIR$/build/classes" /> + </component> + <component name="ProjectType"> + <option name="id" value="Android" /> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/.idea/modules.xml b/mapbox/.idea/modules.xml new file mode 100644 index 0000000000..d0cabd4447 --- /dev/null +++ b/mapbox/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/mapbox.iml" filepath="$PROJECT_DIR$/mapbox.iml" /> + </modules> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/.idea/runConfigurations.xml b/mapbox/.idea/runConfigurations.xml new file mode 100644 index 0000000000..7f68460d8b --- /dev/null +++ b/mapbox/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="RunConfigurationProducerService"> + <option name="ignoredProducers"> + <set> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> + </set> + </option> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/.idea/vcs.xml b/mapbox/.idea/vcs.xml new file mode 100644 index 0000000000..6c0b863585 --- /dev/null +++ b/mapbox/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/.idea/workspace.xml b/mapbox/.idea/workspace.xml new file mode 100644 index 0000000000..6a7a5f7ec9 --- /dev/null +++ b/mapbox/.idea/workspace.xml @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ChangeListManager"> + <list default="true" id="9c1a9a72-4a18-45da-abf8-531f96073483" name="Default Changelist" comment=""> + <change afterPath="$PROJECT_DIR$/../.idea/vcs.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/build.gradle" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/proguard-rules.pro" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/AndroidManifest.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/layout/activity_main.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/mipmap-hdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/mipmap-mdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/mipmap-xhdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/mipmap-xxhdpi/ic_launcher.png" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/values/dimens.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/src/main/res/values/strings.xml" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/../settings.gradle" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../mapbox-gl-js" beforeDir="false" afterPath="$PROJECT_DIR$/../mapbox-gl-js" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/../platform/android/MapboxGLAndroidSDKTestApp/src/main/assets/small_poly.geojson" beforeDir="false" /> + <change beforePath="$PROJECT_DIR$/../vendor/mvt-fixtures" beforeDir="false" afterPath="$PROJECT_DIR$/../vendor/mvt-fixtures" afterDir="false" /> + </list> + <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> + <option name="SHOW_DIALOG" value="false" /> + <option name="HIGHLIGHT_CONFLICTS" value="true" /> + <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> + <option name="LAST_RESOLUTION" value="IGNORE" /> + </component> + <component name="ExternalProjectsManager"> + <system id="GRADLE"> + <state> + <projects_view /> + </state> + </system> + </component> + <component name="FileEditorManager"> + <leaf> + <file pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/local.properties"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + </file> + <file pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/gradlew.bat"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + </file> + </leaf> + </component> + <component name="Git.Settings"> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." /> + </component> + <component name="ProjectFrameBounds"> + <option name="y" value="23" /> + <option name="width" value="1176" /> + <option name="height" value="794" /> + </component> + <component name="ProjectLevelVcsManager" settingsEditedManually="true" /> + <component name="ProjectView"> + <navigator proportions="" version="1"> + <foldersAlwaysOnTop value="true" /> + </navigator> + <panes> + <pane id="PackagesPane" /> + <pane id="ProjectPane" /> + <pane id="AndroidView"> + <subPane> + <expand> + <path> + <item name="mapbox" type="1abcf292:AndroidViewProjectNode" /> + <item name="mapbox" type="462c0819:PsiDirectoryNode" /> + </path> + </expand> + <select /> + </subPane> + </pane> + <pane id="Scope" /> + </panes> + </component> + <component name="PropertiesComponent"> + <property name="android.sdk.path" value="$USER_HOME$/Library/Android/sdk" /> + <property name="settings.editor.selected.configurable" value="AndroidSdkUpdater" /> + </component> + <component name="RunDashboard"> + <option name="ruleStates"> + <list> + <RuleState> + <option name="name" value="ConfigurationTypeDashboardGroupingRule" /> + </RuleState> + <RuleState> + <option name="name" value="StatusDashboardGroupingRule" /> + </RuleState> + </list> + </option> + </component> + <component name="TaskManager"> + <task active="true" id="Default" summary="Default task"> + <changelist id="9c1a9a72-4a18-45da-abf8-531f96073483" name="Default Changelist" comment="" /> + <created>1561784312579</created> + <option name="number" value="Default" /> + <option name="presentableId" value="Default" /> + <updated>1561784312579</updated> + </task> + <servers /> + </component> + <component name="ToolWindowManager"> + <frame x="0" y="23" width="1176" height="794" extended-state="0" /> + <editor active="true" /> + <layout> + <window_info active="true" content_ui="combo" id="Project" visible="true" weight="0.329806" /> + <window_info id="Structure" side_tool="true" /> + <window_info id="Build Variants" side_tool="true" /> + <window_info id="Image Layers" /> + <window_info id="Designer" /> + <window_info id="Resources Explorer" /> + <window_info id="Capture Tool" /> + <window_info id="Favorites" side_tool="true" /> + <window_info id="Captures" order="0" weight="0.25" /> + <window_info anchor="bottom" id="Version Control" /> + <window_info anchor="bottom" id="TODO" /> + <window_info anchor="bottom" id="Terminal" /> + <window_info anchor="bottom" id="Event Log" side_tool="true" /> + <window_info anchor="bottom" id="Build" visible="true" weight="0.32905984" /> + <window_info anchor="right" id="Capture Analysis" /> + <window_info anchor="right" id="Gradle" /> + <window_info anchor="right" id="Theme Preview" /> + <window_info anchor="right" id="Palette	" /> + </layout> + </component> + <component name="editorHistoryManager"> + <entry file="file://$PROJECT_DIR$/gradlew.bat"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + <entry file="file://$PROJECT_DIR$/local.properties"> + <provider selected="true" editor-type-id="text-editor" /> + </entry> + </component> +</project>
\ No newline at end of file diff --git a/mapbox/build.gradle b/mapbox/build.gradle new file mode 100644 index 0000000000..1b6bc62678 --- /dev/null +++ b/mapbox/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + buildToolsVersion "29.0.0" + + defaultConfig { + applicationId "com.example.mapbox" + minSdkVersion 23 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + +} diff --git a/mapbox/gradle/wrapper/gradle-wrapper.jar b/mapbox/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 0000000000..f6b961fd5a --- /dev/null +++ b/mapbox/gradle/wrapper/gradle-wrapper.jar diff --git a/mapbox/gradle/wrapper/gradle-wrapper.properties b/mapbox/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..1d3bd9362a --- /dev/null +++ b/mapbox/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 28 21:58:37 PDT 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/mapbox/gradlew b/mapbox/gradlew new file mode 100644 index 0000000000..cccdd3d517 --- /dev/null +++ b/mapbox/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/mapbox/gradlew.bat b/mapbox/gradlew.bat new file mode 100644 index 0000000000..e95643d6a2 --- /dev/null +++ b/mapbox/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/mapbox/local.properties b/mapbox/local.properties new file mode 100644 index 0000000000..df9f476af1 --- /dev/null +++ b/mapbox/local.properties @@ -0,0 +1,9 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Fri Jun 28 21:58:32 PDT 2019 +ndk.dir=/Users/malwoodsantoro/Library/Android/sdk/ndk-bundle +sdk.dir=/Users/malwoodsantoro/Library/Android/sdk diff --git a/mapbox/mapbox.iml b/mapbox/mapbox.iml new file mode 100644 index 0000000000..0fe7ea9f60 --- /dev/null +++ b/mapbox/mapbox.iml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module external.system.id="GRADLE" type="JAVA_MODULE" version="4"> + <component name="FacetManager"> + <facet type="android-gradle" name="Android-Gradle"> + <configuration> + <option name="GRADLE_PROJECT_PATH" value=":" /> + </configuration> + </facet> + </component> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module>
\ No newline at end of file diff --git a/mapbox/proguard-rules.pro b/mapbox/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/mapbox/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/mapbox/src/main/AndroidManifest.xml b/mapbox/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..82f7d7fe8c --- /dev/null +++ b/mapbox/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.mapbox"> + + <uses-permission android:name="android.permission.WAKE_LOCK" /> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-feature android:name="android.hardware.type.watch" /> + + <application + android:allowBackup="true" + android:name=".MapboxApp" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/Theme.Wearable.Modal"> + <uses-library + android:name="com.google.android.wearable" + android:required="true" /> + + <!-- + Set to true if your app is Standalone, that is, it does not require the handheld + app to run. + --> + <meta-data + android:name="com.google.android.wearable.standalone" + android:value="true" /> + + <activity + android:name=".MainActivity" + android:theme="@style/Theme.Wearable.Modal" + android:label="@string/app_name"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + +</manifest>
\ No newline at end of file diff --git a/mapbox/src/main/assets/map_style.json b/mapbox/src/main/assets/map_style.json new file mode 100755 index 0000000000..cf5af01fa1 --- /dev/null +++ b/mapbox/src/main/assets/map_style.json @@ -0,0 +1,6322 @@ +{ + "version": 8, + "name": "Suunto-Terrain-v2", + "metadata": { + "mapbox:autocomposite": true, + "mapbox:type": "default", + "mapbox:groups": { + "1444934828655.3389": {"name": "Aeroways", "collapsed": true}, + "1444933322393.2852": { + "name": "POI labels (scalerank 1)", + "collapsed": true + }, + "1444934749452.0452": {"name": "Wetlands", "collapsed": true}, + "1444855786460.0557": {"name": "Roads", "collapsed": true}, + "1444933575858.6992": { + "name": "Highway shields", + "collapsed": true + }, + "1444934295202.7542": { + "name": "Admin boundaries", + "collapsed": true + }, + "1444856151690.9143": {"name": "State labels", "collapsed": true}, + "1444933721429.3076": {"name": "Road labels", "collapsed": false}, + "1444933358918.2366": { + "name": "POI labels (scalerank 2)", + "collapsed": false + }, + "1444933808272.805": {"name": "Water labels", "collapsed": true}, + "1444855815295.714": {"name": "Hillshading", "collapsed": true}, + "1444855831248.8289": {"name": "Landcover", "collapsed": true}, + "1444933372896.5967": { + "name": "POI labels (scalerank 3)", + "collapsed": true + }, + "1444855799204.86": {"name": "Bridges", "collapsed": true}, + "1444856087950.3635": {"name": "Marine labels", "collapsed": true}, + "1444862510685.128": {"name": "City labels", "collapsed": true}, + "1444855769305.6016": {"name": "Tunnels", "collapsed": true}, + "1444856144497.7825": { + "name": "Country labels", + "collapsed": false + }, + "1444933456003.5437": { + "name": "POI labels (scalerank 4)", + "collapsed": true + }, + "1444933837268.9458": {"name": "Contour lines", "collapsed": true} + }, + "mapbox:trackposition": true, + "mapbox:sdk-support": { + "js": "0.40.0", + "android": "5.2.0", + "ios": "3.7.0" + } + }, + "center": [25.894779104000122, 60.989524088929244], + "zoom": 13.49759503660035, + "bearing": 0, + "pitch": 0, + "sources": { + "composite": { + "url": "mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v7,asdigital.3xmf51gt,asdigital.4ndqaw5i,asdigital.8gn75sun,asdigital.bx9emb57,asdigital.cin65rxq,asdigital.3zhx939u,asdigital.dj8hnewo,asdigital.3z3k4hf4,asdigital.41m0ih21,asdigital.akzrezo9,asdigital.20xyxn8p,asdigital.72fqy08s", + "type": "vector" + } + }, + "sprite": "mapbox://sprites/asdigital/ciqnol3nm002fc5lvsyci972q", + "glyphs": "mapbox://fonts/asdigital/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "layout": {"visibility": "visible"}, + "paint": { + "background-color": { + "base": 1, + "stops": [[11, "#f3f0e0"], [14, "hsl(51, 40%, 88%)"]] + } + }, + "interactive": true + }, + { + "id": "landcover_crop", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": ["==", "class", "crop"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[0, "#f1ecd5"], [10, "#e6e5bc"]] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[3, 0.6], [7, 0.5], [12, 0]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_grass", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": ["==", "class", "grass"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[0, "#eee7c9"], [10, "#e6e5bc"]] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[1, 0], [3, 0.6], [7, 0.4], [11, 0]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_scrub", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": ["==", "class", "scrub"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [0, "hsl(49, 42%, 83%)"], + [10, "hsl(49, 52%, 87%)"] + ] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[3, 0.6], [7, 0.5], [12, 0]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_wood", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[7, "#d5d1ae"], [10, "#d3db8f"]] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[4, 0.25], [8, 0.1], [11, 0.1], [15, 0.3]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_wood_pattern", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [7, "hsl(53, 32%, 76%)"], + [10, "hsl(66, 51%, 71%)"] + ] + }, + "fill-opacity": {"base": 1.5, "stops": [[12, 0], [14, 0.25]]}, + "fill-antialias": false, + "fill-pattern": "wood" + }, + "interactive": true + }, + { + "id": "landcover_snow", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "filter": ["==", "class", "snow"], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": 0.3, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "national_park", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "filter": ["==", "class", "national_park"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(66, 41%, 64%)", + "fill-opacity": { + "base": 1, + "stops": [[5, 0], [5.5, 0.2], [9, 0.25]] + } + }, + "interactive": true + }, + { + "id": "park", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "all", + ["!in", "type", "garden", "golf_course", "playground", "zoo"], + ["==", "class", "park"] + ], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [10, "hsl(59, 44%, 75%)"], + [14, "hsl(65, 53%, 79%)"] + ] + }, + "fill-opacity": {"base": 1, "stops": [[3, 0], [12, 0.5]]} + }, + "interactive": true + }, + { + "id": "scrub", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 9, + "filter": ["==", "class", "scrub"], + "layout": {}, + "paint": { + "fill-color": "#f2f0d4", + "fill-opacity": {"base": 1, "stops": [[9, 0.2], [12, 0]]} + }, + "interactive": true + }, + { + "id": "grass", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 9, + "filter": ["==", "class", "grass"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "#f2f0d4", + "fill-opacity": {"base": 1, "stops": [[9, 0.4], [12, 0]]} + }, + "interactive": true + }, + { + "id": "wood", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 6, + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[6, "#e4dfbb"], [10, "#d3db8f"]] + }, + "fill-opacity": { + "base": 1, + "stops": [[7, 0.1], [12, 0.4], [15, 0.3]] + } + }, + "interactive": true + }, + { + "id": "wood_pattern", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 6, + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[7, "#e4dfbb"], [10, "#d3db8f"]] + }, + "fill-opacity": {"base": 1, "stops": [[12, 0], [14, 0.25]]}, + "fill-pattern": "wood" + }, + "interactive": true + }, + { + "id": "agriculture", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 11, + "filter": ["==", "class", "agriculture"], + "layout": {}, + "paint": { + "fill-opacity": {"base": 1, "stops": [[11, 0], [16, 0.5]]}, + "fill-color": "hsl(54, 82%, 89%)", + "fill-outline-color": "hsl(54, 63%, 84%)" + }, + "interactive": true + }, + { + "id": "national_park-tint-band", + "type": "line", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 7, + "filter": ["==", "class", "national_park"], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(72, 47%, 66%)", + "line-width": {"base": 1.4, "stops": [[9, 1], [14, 6]]}, + "line-offset": {"base": 1.4, "stops": [[9, 0], [14, -2.5]]}, + "line-opacity": {"base": 1, "stops": [[7, 0], [10, 0.4]]}, + "line-blur": 3 + }, + "interactive": true + }, + { + "id": "national_park-outline", + "type": "line", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 7, + "filter": ["==", "class", "national_park"], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 36%, 64%)", + "line-width": {"base": 1, "stops": [[9, 0.75], [12, 1]]}, + "line-offset": 0, + "line-opacity": {"base": 1, "stops": [[7, 0], [13, 1]]} + }, + "interactive": true + }, + { + "id": "hospital", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "hospital"], + "layout": {}, + "paint": {"fill-color": "#ebe8d8"}, + "interactive": true + }, + { + "id": "school", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "school"], + "layout": {}, + "paint": {"fill-color": "#ebe8d8", "fill-opacity": 1}, + "interactive": true + }, + { + "id": "other-green-areas", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "all", + ["==", "class", "park"], + ["in", "type", "garden", "golf_course", "playground", "zoo"] + ], + "layout": {}, + "paint": { + "fill-color": "#e1e6ad", + "fill-opacity": {"base": 1, "stops": [[9, 0], [11, 0.7]]} + }, + "interactive": true + }, + { + "id": "glacier", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 9, + "filter": ["==", "class", "glacier"], + "layout": {}, + "paint": { + "fill-color": "hsl(196, 78%, 96%)", + "fill-opacity": {"base": 1, "stops": [[9, 0], [10, 0.5]]} + }, + "interactive": true + }, + { + "id": "pitch", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "pitch"], + "layout": {"visibility": "visible"}, + "paint": {"fill-color": "hsl(0, 0%, 100%)", "fill-opacity": 0.3}, + "interactive": true + }, + { + "id": "pitch-line", + "type": "line", + "source": "composite", + "source-layer": "landuse", + "minzoom": 15, + "filter": ["==", "class", "pitch"], + "layout": {"line-join": "miter"}, + "paint": {"line-color": "hsl(75, 29%, 85%)"}, + "interactive": true + }, + { + "id": "cemetery", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "cemetery"], + "layout": {}, + "paint": {"fill-color": "#e1e6ad", "fill-opacity": 0.7}, + "interactive": true + }, + { + "id": "industrial", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "industrial"], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": {"base": 1, "stops": [[6, 0], [10, 0.3]]} + }, + "interactive": true + }, + { + "id": "sand", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "sand"], + "layout": {}, + "paint": {"fill-color": "hsl(51, 60%, 95%)"}, + "interactive": true + }, + { + "id": "contour-line", + "type": "line", + "metadata": {"mapbox:group": "1444933837268.9458"}, + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": ["!in", "index", 10, 5], + "layout": {}, + "paint": { + "line-opacity": {"base": 1, "stops": [[11, 0.15], [12, 0.3]]}, + "line-color": { + "base": 1, + "stops": [[12, "#748c37"], [14, "#868c76"]] + }, + "line-width": {"base": 1, "stops": [[13, 0.5], [16, 0.8]]}, + "line-offset": {"base": 1, "stops": [[13, 1], [16, 1.6]]} + }, + "interactive": true + }, + { + "id": "contour-line-index", + "type": "line", + "metadata": {"mapbox:group": "1444933837268.9458"}, + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": ["in", "index", 10, 5], + "layout": {}, + "paint": { + "line-opacity": {"base": 1, "stops": [[11, 0.3], [12, 0.5]]}, + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(77, 44%, 38%)"], + [14, "hsl(77, 9%, 51%)"] + ] + }, + "line-width": {"base": 1, "stops": [[13, 0.6], [16, 1.2]]}, + "line-offset": {"base": 1, "stops": [[13, 0.6], [16, 1.2]]} + }, + "interactive": true + }, + { + "id": "hillshade_highlight_bright", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 18, + "filter": ["==", "level", 94], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": {"stops": [[15, 0.15], [18, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_highlight_med", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "filter": ["==", "level", 90], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": {"stops": [[15, 0.15], [18, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_faint", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 17, + "filter": ["==", "level", 89], + "layout": {}, + "paint": { + "fill-color": "#543c17", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_med", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "filter": ["==", "level", 78], + "layout": {}, + "paint": { + "fill-color": "#543c17", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_dark", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "filter": ["==", "level", 67], + "layout": {}, + "paint": { + "fill-color": "#581470", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_extreme", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 17, + "filter": ["==", "level", 56], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(284, 47%, 27%)", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "waterway-river-canal-shadow", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "filter": ["in", "class", "canal", "river"], + "layout": { + "line-cap": {"base": 1, "stops": [[0, "butt"], [11, "round"]]}, + "line-join": "round" + }, + "paint": { + "line-color": "hsl(220, 53%, 74%)", + "line-width": {"base": 1.3, "stops": [[8.5, 0.4], [20, 8]]}, + "line-opacity": {"base": 1, "stops": [[8, 0], [8.5, 1]]}, + "line-translate": { + "base": 1.2, + "stops": [[7, [0, 0]], [16, [-1, -1]]] + }, + "line-translate-anchor": "viewport" + }, + "interactive": true + }, + { + "id": "waterway-river-canal", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "filter": ["in", "class", "canal", "river"], + "layout": { + "line-cap": {"base": 1, "stops": [[0, "butt"], [11, "round"]]}, + "line-join": "round" + }, + "paint": { + "line-color": "hsl(208, 27%, 84%)", + "line-width": {"base": 1.3, "stops": [[8.5, 0.4], [20, 8]]}, + "line-opacity": {"base": 1, "stops": [[8, 0], [8.5, 1]]} + }, + "interactive": true + }, + { + "id": "waterway-small", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 13, + "filter": ["!in", "class", "canal", "river"], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(217, 71%, 73%)", + "line-width": {"base": 1.35, "stops": [[13.5, 0.4], [20, 3]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.5, 1]]} + }, + "interactive": true + }, + { + "id": "water-shadow", + "type": "fill", + "source": "composite", + "source-layer": "water", + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(215, 67%, 79%)", + "fill-translate": { + "base": 1.2, + "stops": [[7, [0, 0]], [16, [-1, -1]]] + }, + "fill-translate-anchor": "viewport", + "fill-opacity": 1 + }, + "interactive": true + }, + { + "id": "water", + "type": "fill", + "source": "composite", + "source-layer": "water", + "layout": {}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[1, "hsl(219, 26%, 88%)"], [10, "#cfdce7"]] + } + }, + "interactive": true + }, + { + "id": "wetlands", + "type": "fill", + "metadata": {"mapbox:group": "1444934749452.0452"}, + "source": "composite", + "source-layer": "landuse_overlay", + "filter": ["in", "class", "wetland", "wetland_noveg"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(162, 39%, 48%)", + "fill-opacity": 0.1, + "fill-outline-color": "hsla(146, 37%, 67%, 0)" + }, + "interactive": true + }, + { + "id": "wetlands-pattern", + "type": "fill", + "metadata": {"mapbox:group": "1444934749452.0452"}, + "source": "composite", + "source-layer": "landuse_overlay", + "filter": ["in", "class", "wetland", "wetland_noveg"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(185, 43%, 74%)", + "fill-opacity": {"base": 1, "stops": [[11, 0], [16, 0.35]]}, + "fill-translate-anchor": "viewport", + "fill-pattern": "wetland2" + }, + "interactive": true + }, + { + "id": "barrier_line-land-polygon", + "type": "fill", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["==", "class", "land"] + ], + "layout": {}, + "paint": {"fill-color": "hsl(53, 7%, 76%)"}, + "interactive": true + }, + { + "id": "barrier_line-land-line", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "class", "land"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": {"base": 1.99, "stops": [[14, 0.75], [20, 40]]}, + "line-color": "#c7c6bf" + }, + "interactive": true + }, + { + "id": "aeroway-polygon", + "type": "fill", + "metadata": {"mapbox:group": "1444934828655.3389"}, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + ["!=", "type", "apron"], + ["==", "$type", "Polygon"] + ], + "layout": {}, + "paint": { + "fill-color": "#d6d4c9", + "fill-opacity": {"base": 1, "stops": [[11, 0], [11.5, 1]]} + }, + "interactive": true + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": {"mapbox:group": "1444934828655.3389"}, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "type", "runway"] + ], + "layout": {}, + "paint": { + "line-color": "hsl(51, 14%, 81%)", + "line-width": {"base": 1.5, "stops": [[9, 1], [18, 80]]} + }, + "interactive": true + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": {"mapbox:group": "1444934828655.3389"}, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "type", "taxiway"] + ], + "layout": {}, + "paint": { + "line-color": "#d6d4c9", + "line-width": {"base": 1.5, "stops": [[10, 0.5], [18, 20]]} + }, + "interactive": true + }, + { + "id": "building", + "type": "fill", + "source": "composite", + "source-layer": "building", + "minzoom": 15, + "filter": ["==", "underground", "false"], + "layout": {}, + "paint": { + "fill-color": "hsl(54, 20%, 85%)", + "fill-opacity": {"base": 1, "stops": [[15.5, 0], [16, 1]]}, + "fill-outline-color": "hsla(35, 13%, 71%, 0.3)" + }, + "interactive": true + }, + { + "id": "tunnel-street-low", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(38, 24%, 80%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "tunnel-street_limited-low", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(38, 24%, 80%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "tunnel-track-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#a69577", + "line-gap-width": {"base": 1.5, "stops": [[15, 1], [18, 12]]}, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-service-link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "hsl(35, 20%, 74%)", + "line-gap-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-street_limited-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "hsl(35, 20%, 74%)", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3], + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-street-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "hsl(36, 24%, 67%)", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3], + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-secondary-tertiary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.2, "stops": [[10, 0.75], [18, 2]]}, + "line-dasharray": [3, 3], + "line-gap-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsl(34, 23%, 78%)" + }, + "interactive": true + }, + { + "id": "tunnel-primary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "primary"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-dasharray": [3, 3], + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#d4cdc4" + }, + "interactive": true + }, + { + "id": "tunnel-trunk_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#bfb09c", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-motorway_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#bfb09c", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-trunk-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["==", "type", "trunk"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "hsl(34, 21%, 68%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": 1, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-motorway-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "#bfb09d", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": 1, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-construction", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["==", "class", "construction"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#c9c3b9", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "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]] + ] + } + }, + "interactive": true + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "type", "cycleway", "piste", "steps"], + ["==", "class", "path"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [3, 0.4]], + [16, [3, 0.35]], + [17, [3, 0.35]] + ] + }, + "line-color": "#c9c3b9", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-cycleway-piste", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "tunnel"], + ["in", "type", "cycleway", "piste"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [3, 0.4]], + [16, [3, 0.35]], + [17, [3, 0.35]] + ] + }, + "line-color": "hsl(10, 100%, 81%)", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-steps", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "structure", "tunnel"], ["==", "type", "steps"]] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[15, 1], [16, 1.6], [18, 6]] + }, + "line-color": "#c9c3b9", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.4]], + [16, [0.75, 0.4]], + [17, [0.3, 0.3]] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-trunk_link", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "tunnel-motorway_link", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsla(0, 0%, 100%, 0.8)", + "line-opacity": 1, + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "tunnel-pedestrian", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "tunnel"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "#c9c3b9", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [[14, [1, 0]], [15, [1.5, 0.4]], [16, [1, 0.2]]] + } + }, + "interactive": true + }, + { + "id": "tunnel-track", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 12]]}, + "line-color": "hsl(0, 0%, 91%)" + }, + "interactive": true + }, + { + "id": "tunnel-service-link", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "tunnel-street_limited", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#c9c3b9", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-street", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-opacity": 1, + "line-dasharray": [1, 0], + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "tunnel-primary", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "primary"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-opacity": 1, + "line-dasharray": [1, 0], + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "tunnel-oneway-arrows-blue-minor", + "type": "symbol", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "oneway", "true"], + ["==", "structure", "tunnel"], + [ + "in", + "class", + "link", + "path", + "pedestrian", + "service", + "track" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[17, "oneway-small"], [18, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "tunnel-oneway-arrows-blue-major", + "type": "symbol", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "oneway", "true"], + ["==", "structure", "tunnel"], + [ + "in", + "class", + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[16, "oneway-small"], [17, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "tunnel-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "trunk"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsla(0, 0%, 100%, 0.9)" + }, + "interactive": true + }, + { + "id": "tunnel-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-dasharray": [1, 0], + "line-opacity": 1, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "tunnel-oneway-arrows-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "!in", + "type", + "primary_link", + "secondary_link", + "tertiary_link" + ], + ["==", "oneway", "true"], + ["==", "structure", "tunnel"], + ["in", "class", "link", "trunk"] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [ + [16, "oneway-white-small"], + [17, "oneway-white-large"] + ] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {"icon-opacity": 0.5}, + "interactive": true + }, + { + "id": "cliffs", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 15, + "filter": ["==", "class", "cliff"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-opacity": {"base": 1, "stops": [[15, 0], [15.25, 1]]}, + "line-width": 10, + "line-pattern": "cliff2" + }, + "interactive": true + }, + { + "id": "ferry", + "type": "line", + "source": "composite", + "source-layer": "road", + "filter": ["==", "type", "ferry"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "base": 1, + "stops": [[10, "#b6c8e0"], [17, "#5986c5"]] + }, + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]}, + "line-dasharray": { + "base": 1, + "stops": [[12, [1, 0]], [13, [12, 4]]] + } + }, + "interactive": true + }, + { + "id": "ferry-auto", + "type": "line", + "source": "composite", + "source-layer": "road", + "filter": ["==", "type", "ferry_auto"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [10, "hsl(215, 41%, 80%)"], + [17, "hsl(215, 48%, 56%)"] + ] + }, + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]} + }, + "interactive": true + }, + { + "id": "road-pedestrian-polygon-fill", + "type": "fill", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "Polygon"], + [ + "all", + ["==", "structure", "none"], + ["in", "class", "path", "pedestrian"] + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(54, 40%, 92%)", + "fill-outline-color": "hsla(0, 0%, 100%, 0)", + "fill-opacity": {"base": 1, "stops": [[12, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "europe-from-1-1-to-1-4-3-2 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_1_to_1_4_3_2", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-1-4-3-3-to-3-1-1 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_4_3_3_to_3_1_1", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-1-2-to-3-2-1-2-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_1_2_to_3_2_1_2_4", + "minzoom": 10, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-2-1-3-to-3-2-3 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_1_3_to_3_2_3", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-2-4-to-4-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_4_to_4_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "antarctica copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "antarctica", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "australia-oceania copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "australia_oceania", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "africa-all copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "africa_all", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "america-from-1-to-2-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_1_to_2_4", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "asia-all copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "asia_all", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "america-from-3-to-4-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_3_to_4_4", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-2-1-3-to-3-2-3", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_1_3_to_3_2_3", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "europe-from-3-1-2-to-3-2-1-2-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_1_2_to_3_2_1_2_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "europe-from-1-4-3-3-to-3-1-1", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_4_3_3_to_3_1_1", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "europe-from-1-1-to-1-4-3-2", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_1_to_1_4_3_2", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "america-from-3-to-4-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_3_to_4_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "asia-all", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "asia_all", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "america-from-1-to-2-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_1_to_2_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "africa-all", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "africa_all", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "australia-oceania", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "australia_oceania", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "antarctica", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "antarctica", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "europe-from-3-2-4-to-4-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_4_to_4_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "road-path-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + [ + "!in", + "type", + "corridor", + "crossing", + "piste", + "sidewalk", + "steps" + ], + ["==", "class", "path"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2], [18, 10]]}, + "line-opacity": {"base": 1, "stops": [[14.3, 0], [14.5, 1]]}, + "line-color": "hsl(75, 100%, 97%)", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "road-sidewalk-corridor-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "type", "corridor", "crossing", "sidewalk"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2], [18, 10]]}, + "line-dasharray": [1, 0], + "line-color": "hsl(0, 0%, 100%)", + "line-blur": 0, + "line-opacity": {"base": 1, "stops": [[16, 0], [16.25, 1]]} + }, + "interactive": true + }, + { + "id": "road-piste-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["==", "type", "piste"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2.7], [19, 10.4]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.5, 1]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "road-track-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "track"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 2.2], [19, 10]]}, + "line-color": "#8f8370", + "line-gap-width": 0, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.1, 1]]} + }, + "interactive": true + }, + { + "id": "road-steps-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "steps"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2.5], [18, 8]]}, + "line-color": "#fbfff0", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 0.6]]} + }, + "interactive": true + }, + { + "id": "road-pedestrian-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2], [18, 14.5]]}, + "line-color": "#c4c0b9", + "line-gap-width": 0, + "line-opacity": {"base": 1, "stops": [[14.75, 0], [15, 1]]} + }, + "interactive": true + }, + { + "id": "road-street-low", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "street"], ["==", "structure", "none"]] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 1.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11, 0], [11.25, 1], [13, 1], [13.25, 0]] + } + }, + "interactive": true + }, + { + "id": "road-street_limited-low", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11, 0], [11.25, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "road-service-link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.2], [20, 2]]}, + "line-color": "#c4c0b9", + "line-gap-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-opacity": {"base": 1, "stops": [[14.5, 0], [15, 1]]} + }, + "interactive": true + }, + { + "id": "road-street_limited-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 1], [20, 2]]}, + "line-color": "hsl(36, 9%, 75%)", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "road-street-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "street"], ["==", "structure", "none"]] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 1], [20, 2]]}, + "line-color": "#c4c0b9", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0], [13, 1.2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.5, 1]]} + }, + "interactive": true + }, + { + "id": "road-secondary-tertiary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.2, "stops": [[10, 0.75], [18, 2.6]]}, + "line-color": "#c1bdb6", + "line-gap-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-opacity": {"base": 1, "stops": [[10.5, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "road-primary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "primary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2.6]]}, + "line-color": "#c1bdb6", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": {"base": 1, "stops": [[9, 0], [10, 1]]} + }, + "interactive": true + }, + { + "id": "road-motorway_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "road-trunk_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "road-trunk-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "trunk"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[9, 1], [16, 2]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": {"base": 1, "stops": [[7.9, 0], [8, 1]]} + }, + "interactive": true + }, + { + "id": "road-motorway-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[9, 1], [16, 2]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": {"base": 1, "stops": [[7.9, 0], [8, 1]]} + }, + "interactive": true + }, + { + "id": "road-construction", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "construction"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(36, 9%, 67%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "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]] + ] + } + }, + "interactive": true + }, + { + "id": "road-sidewalk-corridor", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "type", "corridor", "crossing", "sidewalk"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "hsl(36, 13%, 68%)", + "line-dasharray": [1, 0], + "line-opacity": {"base": 1, "stops": [[16, 0], [16.25, 1]]} + }, + "interactive": true + }, + { + "id": "road-path-smooth", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["in", "type", "bridleway", "footway", "path"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 1.2], [18, 4]]}, + "line-color": "#8f8370", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [3, 0.4]], + [15, [3, 0.4]], + [16, [3, 0.35]], + [17, [3, 0.35]] + ] + }, + "line-opacity": {"base": 1, "stops": [[14.2, 0], [14.4, 1]]} + }, + "interactive": true + }, + { + "id": "road-path-rough", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["in", "type", "hiking", "mountain_bike", "trail"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 1.2], [18, 4]]}, + "line-color": "#8f8370", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.6]], + [16, [1, 0.6]], + [17, [1, 0.35]] + ] + }, + "line-opacity": {"base": 1, "stops": [[14.2, 0], [14.4, 1]]} + }, + "interactive": true + }, + { + "id": "road-track", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "track"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.4], [18, 4]]}, + "line-color": "#fbffed", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.1, 1]]}, + "line-dasharray": [3, 0] + }, + "interactive": true + }, + { + "id": "road-cycleway", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["==", "type", "cycleway"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.4], [18, 4]]}, + "line-color": "hsl(0, 92%, 76%)", + "line-opacity": {"base": 1, "stops": [[14.2, 0], [14.3, 1]]}, + "line-dasharray": [3, 0.35] + }, + "interactive": true + }, + { + "id": "road-steps", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "steps"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[15, 1], [16, 1.6], [18, 6]] + }, + "line-color": "hsl(43, 8%, 46%)", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.4]], + [16, [0.75, 0.4]], + [17, [0.3, 0.3]] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "road-trunk_link", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bebebe", + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "road-motorway_link", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bfbdb0", + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "road-pedestrian", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 1], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [[14, [1, 0]], [15, [1.5, 0.4]], [16, [1, 0.2]]] + } + }, + "interactive": true + }, + { + "id": "road-piste", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["==", "type", "piste"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.4], [18, 4]]}, + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(250, 47%, 70%)"], + [16, "hsl(220, 67%, 63%)"] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-dasharray": [3, 0.35] + }, + "interactive": true + }, + { + "id": "road-service-link", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.2], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)" + }, + "interactive": true + }, + { + "id": "road-street_limited", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "none"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "road-street", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "street"], ["==", "structure", "none"]] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [13, 1.2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.1, 1]]} + }, + "interactive": true + }, + { + "id": "road-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 8, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[8.9, 0], [9, 1]]} + }, + "interactive": true + }, + { + "id": "road-primary", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "primary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[5, 0], [5.5, 1]]} + }, + "interactive": true + }, + { + "id": "road-oneway-arrows-blue-minor", + "type": "symbol", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["==", "oneway", "true"], + [ + "in", + "class", + "link", + "path", + "pedestrian", + "service", + "track" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[17, "oneway-small"], [18, "oneway-large"]] + }, + "icon-rotation-alignment": "map", + "icon-padding": 2, + "symbol-spacing": 200 + }, + "paint": {}, + "interactive": true + }, + { + "id": "road-oneway-arrows-blue-major", + "type": "symbol", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["==", "oneway", "true"], + [ + "in", + "class", + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[16, "oneway-small"], [17, "oneway-large"]] + }, + "icon-rotation-alignment": "map", + "icon-padding": 2, + "symbol-spacing": 200 + }, + "paint": {}, + "interactive": true + }, + { + "id": "road-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "trunk"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": { + "base": 1, + "stops": [ + [7.9, "hsl(0, 0%, 99%)"], + [8, "hsl(257, 19%, 73%)"] + ] + } + }, + "interactive": true + }, + { + "id": "road-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": { + "base": 1, + "stops": [ + [7.9, "hsl(0, 0%, 100%)"], + [8, "hsl(43, 61%, 67%)"] + ] + } + }, + "interactive": true + }, + { + "id": "road-rail", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [[13, "#cccabe"], [16, "hsl(24, 7%, 66%)"]] + }, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]}, + "line-opacity": {"base": 1, "stops": [[12, 0], [13, 1]]} + }, + "interactive": true + }, + { + "id": "road-rail-tracks", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [[13, "hsl(50, 12%, 77%)"], [16, "#ada6a1"]] + }, + "line-width": {"base": 1.5, "stops": [[14, 4], [20, 8]]}, + "line-dasharray": [0.1, 15], + "line-opacity": {"base": 1, "stops": [[13.75, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "road-oneway-arrows-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + [ + "!in", + "type", + "primary_link", + "secondary_link", + "tertiary_link" + ], + ["==", "oneway", "true"], + ["in", "class", "link", "trunk"] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [ + [16, "oneway-white-small"], + [17, "oneway-white-large"] + ] + }, + "icon-padding": 2, + "symbol-spacing": 200 + }, + "paint": {"icon-opacity": 0.5}, + "interactive": true + }, + { + "id": "hedges", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 16, + "filter": ["==", "class", "hedge"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(70, 41%, 66%)", + "line-width": {"base": 1, "stops": [[16, 1], [20, 3]]}, + "line-opacity": 1, + "line-dasharray": [1, 2, 5, 2, 1, 2] + }, + "interactive": true + }, + { + "id": "fences", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 16, + "filter": ["==", "class", "fence"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(46, 17%, 76%)", + "line-width": {"base": 1, "stops": [[16, 1], [20, 3]]}, + "line-opacity": 1, + "line-dasharray": [1, 2, 5, 2, 1, 2] + }, + "interactive": true + }, + { + "id": "gates", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 17, + "filter": ["==", "class", "gate"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(46, 17%, 76%)", + "line-width": {"base": 1, "stops": [[16, 1], [20, 3]]}, + "line-opacity": 0.5, + "line-dasharray": [1, 2, 5, 2, 1, 2] + }, + "interactive": true + }, + { + "id": "bridge-path-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "type", "piste", "steps"], + ["==", "class", "path"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2.5], [18, 11]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-color": "#fbfff0", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-path-bg copy", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "cycleway"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2.6], [19, 10.4]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-color": "#fffadb", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-piste-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "piste"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2.6], [19, 10.4]]}, + "line-dasharray": [1, 0], + "line-color": "#fbfff0", + "line-blur": 0, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-steps-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "structure", "bridge"], ["==", "type", "steps"]] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2.5], [18, 8]]}, + "line-color": "#fffadb", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-pedestrian-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "bridge"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2], [18, 14.5]]}, + "line-color": "hsl(230, 24%, 87%)", + "line-gap-width": 0, + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-street-low", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "bridge-street_limited-low", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "bridge-track-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 2.7], [19, 10.4]]}, + "line-color": "#9f927f", + "line-gap-width": 0 + }, + "interactive": true + }, + { + "id": "bridge-service-link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "bridge"], + ["in", "class", "link", "service"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#d1c7b8", + "line-gap-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]} + }, + "interactive": true + }, + { + "id": "bridge-street_limited-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#d1c7b8", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + } + }, + "interactive": true + }, + { + "id": "bridge-street-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#c9baa6", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + } + }, + "interactive": true + }, + { + "id": "bridge-secondary-tertiary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.2, "stops": [[10, 0.75], [18, 2]]}, + "line-color": "#d4cdc4", + "line-gap-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-translate": [0, 0] + }, + "interactive": true + }, + { + "id": "bridge-primary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "primary"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "#bfb09d", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-translate": [0, 0] + }, + "interactive": true + }, + { + "id": "bridge-trunk_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "bridge-trunk-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "trunk"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "#fff", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-construction", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["==", "class", "construction"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(36, 4%, 38%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "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]] + ] + } + }, + "interactive": true + }, + { + "id": "bridge-path", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "type", "cycleway", "piste", "steps"], + ["==", "class", "path"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "#8a7d69", + "line-dasharray": [2, 0], + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-cycleway", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "cycleway"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "#fa8989", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-piste", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "piste"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "#618ce0", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-dasharray": [2, 0] + }, + "interactive": true + }, + { + "id": "bridge-steps", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "structure", "bridge"], ["==", "type", "steps"]] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[15, 1], [16, 1.6], [18, 6]] + }, + "line-color": "hsl(43, 10%, 55%)", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.4]], + [16, [0.75, 0.4]], + [17, [0.3, 0.3]] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-trunk_link", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bebebe" + }, + "interactive": true + }, + { + "id": "bridge-motorway_link", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bfbdb0" + }, + "interactive": true + }, + { + "id": "bridge-pedestrian", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "bridge"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [[14, [1, 0]], [15, [1.5, 0.4]], [16, [1, 0.2]]] + } + }, + "interactive": true + }, + { + "id": "bridge-track", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "bridge"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.2], [18, 4]]}, + "line-color": "#f8f7e8", + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "bridge-service-link", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "bridge"], + ["in", "class", "link", "service", "track"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)" + }, + "interactive": true + }, + { + "id": "bridge-street_limited", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(35, 14%, 93%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-street", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "type", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[5, 0], [5.5, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-primary", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "bridge"], + ["==", "type", "primary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[5, 0], [5.5, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-oneway-arrows-blue-minor", + "type": "symbol", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["==", "oneway", "true"], + ["==", "structure", "bridge"], + [ + "in", + "class", + "link", + "path", + "pedestrian", + "service", + "track" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[17, "oneway-small"], [18, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "bridge-oneway-arrows-blue-major", + "type": "symbol", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", "true"], + ["==", "structure", "bridge"], + [ + "in", + "class", + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[16, "oneway-small"], [17, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "bridge-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "trunk"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#bebebe" + }, + "interactive": true + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#bfbdb0" + }, + "interactive": true + }, + { + "id": "bridge-rail", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [[13, "hsl(50, 17%, 82%)"], [16, "#9c998f"]] + }, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-rail-tracks", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [ + [13, "hsl(50, 17%, 82%)"], + [16, "hsl(49, 6%, 59%)"] + ] + }, + "line-width": {"base": 1.5, "stops": [[14, 4], [20, 8]]}, + "line-dasharray": [0.1, 15], + "line-opacity": {"base": 1, "stops": [[13.75, 0], [20, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-trunk_link-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway_link-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "bridge-trunk-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "trunk"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[10, 1], [16, 2]]}, + "line-color": "#bfb09c", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[10, 1], [16, 2]]}, + "line-color": "#fff", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-trunk_link-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bebebe" + }, + "interactive": true + }, + { + "id": "bridge-motorway_link-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#b8b59d" + }, + "interactive": true + }, + { + "id": "bridge-trunk-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "trunk"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsl(0, 0%, 100%)" + }, + "interactive": true + }, + { + "id": "bridge-motorway-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#bfbdb0" + }, + "interactive": true + }, + { + "id": "bridge-oneway-arrows-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "!in", + "type", + "primary_link", + "secondary_link", + "tertiary_link" + ], + ["==", "oneway", "true"], + ["==", "structure", "bridge"], + ["in", "class", "link", "trunk"] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [ + [16, "oneway-white-small"], + [17, "oneway-white-large"] + ] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {"icon-opacity": 0.5}, + "interactive": true + }, + { + "id": "aerialway-bg-gondola-chairlift", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "in", + "type", + "aerialway:chair_lift", + "aerialway:drag_lift", + "aerialway:gondola" + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(220, 21%, 32%)", + "line-width": { + "base": 1.5, + "stops": [[10, 0.5], [12, 1], [20, 8]] + }, + "line-blur": 0.5, + "line-opacity": {"base": 1, "stops": [[12, 0.6], [13, 1]]} + }, + "interactive": true + }, + { + "id": "aerialway-gondola-chairlift", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "in", + "type", + "aerialway:chair_lift", + "aerialway:drag_lift", + "aerialway:gondola" + ], + "layout": { + "line-join": "round", + "visibility": "visible", + "line-cap": "round" + }, + "paint": { + "line-color": "#607194", + "line-width": { + "base": 1.5, + "stops": [[10, 1.2], [12, 2], [18, 8]] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [10, [0.01, 3, 0.01]], + [13, [0.01, 6, 0.01]], + [16, [0.02, 10, 0.02]] + ] + }, + "line-opacity": {"base": 1, "stops": [[12, 0.4], [13, 1]]} + }, + "interactive": true + }, + { + "id": "contour-label", + "type": "symbol", + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": ["in", "index", 10, 5], + "layout": { + "text-field": "{ele} m", + "symbol-placement": "line", + "text-max-angle": 25, + "text-padding": 5, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[15, 9.5], [20, 12]]} + }, + "paint": { + "text-color": "hsl(77, 21%, 37%)", + "text-halo-width": 1, + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 100%, 0.5)" + }, + "interactive": true + }, + { + "id": "admin-2-boundaries-bg", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": ["all", ["==", "admin_level", 2], ["==", "maritime", 0]], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": {"base": 1, "stops": [[3, 3.5], [10, 8]]}, + "line-color": "#fffadb", + "line-opacity": {"base": 1, "stops": [[3, 0], [4, 0.5]]}, + "line-translate": [0, 0], + "line-blur": {"base": 1, "stops": [[3, 0], [10, 2]]} + }, + "interactive": true + }, + { + "id": "admin-3-4-boundaries-bg", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "filter": ["all", ["==", "maritime", 0], [">=", "admin_level", 3]], + "layout": {"line-join": "bevel", "visibility": "visible"}, + "paint": { + "line-color": "hsl(52, 100%, 98%)", + "line-width": {"base": 1, "stops": [[7, 3.75], [12, 8]]}, + "line-opacity": {"base": 1, "stops": [[11, 0], [12, 0.9]]}, + "line-dasharray": [1, 0], + "line-translate": [0, 0], + "line-blur": {"base": 1, "stops": [[3, 0], [8, 2]]} + }, + "interactive": true + }, + { + "id": "admin-3-4-boundaries", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "filter": ["all", ["==", "maritime", 0], [">=", "admin_level", 3]], + "layout": { + "line-join": "round", + "line-cap": "round", + "visibility": "visible" + }, + "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": [ + [6, "hsl(47, 27%, 79%)"], + [10, "hsl(32, 7%, 52%)"] + ] + } + }, + "interactive": true + }, + { + "id": "admin-2-boundaries-dispute", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + ["==", "admin_level", 2], + ["==", "disputed", 1], + ["==", "maritime", 0] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-dasharray": [1.5, 1.5], + "line-color": "#8c7e6e", + "line-width": {"base": 1, "stops": [[3, 0.5], [10, 2]]} + }, + "interactive": true + }, + { + "id": "admin-2-boundaries", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + ["==", "admin_level", 2], + ["==", "disputed", 0], + ["==", "maritime", 0] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(33, 12%, 49%)", + "line-width": {"base": 1, "stops": [[3, 0.5], [10, 2]]}, + "line-opacity": {"base": 1, "stops": [[0, 0.4], [5, 1]]} + }, + "interactive": true + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "composite", + "source-layer": "waterway_label", + "minzoom": 12, + "filter": ["in", "class", "canal", "river"], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-max-angle": 30, + "text-size": {"base": 1, "stops": [[13, 12], [18, 16]]}, + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 0.5, + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-color": "hsl(213, 23%, 51%)", + "text-halo-width": 0.5 + }, + "interactive": true + }, + { + "id": "poi-relevant-scalerank4-l15", + "type": "symbol", + "metadata": {"mapbox:group": "1444933456003.5437"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + ["==", "scalerank", 4], + [">=", "localrank", 15], + [ + "in", + "maki", + "amusement-park", + "aquarium", + "attraction", + "bakery", + "bank", + "bar", + "beer", + "bus", + "cafe", + "castle", + "college", + "doctor", + "fast-food", + "ferry", + "fire-station", + "fuel", + "grocery", + "harbor", + "hospital", + "ice-cream", + "lodging", + "marker", + "monument", + "museum", + "pharmacy", + "police", + "post", + "restaurant", + "rocket", + "stadium", + "swimming" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "visibility": "visible", + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-relevant-scalerank4-l1", + "type": "symbol", + "metadata": {"mapbox:group": "1444933456003.5437"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + ["<=", "localrank", 14], + ["==", "scalerank", 4], + [ + "in", + "maki", + "amusement-park", + "aquarium", + "attraction", + "bakery", + "bank", + "bar", + "beer", + "bus", + "cafe", + "castle", + "college", + "doctor", + "fast-food", + "ferry", + "fire-station", + "fuel", + "grocery", + "harbor", + "hospital", + "ice-cream", + "lodging", + "marker", + "monument", + "museum", + "pharmacy", + "police", + "post", + "restaurant", + "rocket", + "stadium", + "swimming" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "visibility": "visible", + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-parks_scalerank4", + "type": "symbol", + "metadata": {"mapbox:group": "1444933456003.5437"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + ["==", "scalerank", 4], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-scalerank3", + "type": "symbol", + "metadata": {"mapbox:group": "1444933372896.5967"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + ["==", "scalerank", 3] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "visibility": "visible", + "text-offset": [0, 0.9], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-parks-scalerank3", + "type": "symbol", + "metadata": {"mapbox:group": "1444933372896.5967"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + ["==", "scalerank", 3], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "visibility": "visible", + "text-offset": [0, 0.9], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "road-label-small", + "type": "symbol", + "metadata": {"mapbox:group": "1444933721429.3076"}, + "source": "composite", + "source-layer": "road_label", + "minzoom": 15, + "filter": [ + "all", + [ + "!in", + "class", + "aerialway", + "link", + "motorway", + "path", + "pedestrian", + "primary", + "secondary", + "street", + "street_limited", + "tertiary", + "trunk" + ], + ["==", "$type", "LineString"] + ], + "layout": { + "text-size": {"base": 1, "stops": [[15, 10], [20, 13]]}, + "text-max-angle": 30, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 0%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "road-label-medium", + "type": "symbol", + "metadata": {"mapbox:group": "1444933721429.3076"}, + "source": "composite", + "source-layer": "road_label", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "in", + "class", + "aerialway", + "link", + "path", + "pedestrian", + "street", + "street_limited" + ] + ], + "layout": { + "text-size": {"base": 1, "stops": [[11, 9], [20, 14]]}, + "text-max-angle": 30, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 0%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "road-label-large", + "type": "symbol", + "metadata": {"mapbox:group": "1444933721429.3076"}, + "source": "composite", + "source-layer": "road_label", + "filter": [ + "in", + "class", + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + "layout": { + "text-size": {"base": 1, "stops": [[6, 8], [20, 14]]}, + "text-max-angle": 30, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.5, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "road-shields-black", + "type": "symbol", + "metadata": {"mapbox:group": "1444933575858.6992"}, + "source": "composite", + "source-layer": "road_label", + "filter": [ + "all", + [ + "!in", + "shield", + "at-expressway", + "at-motorway", + "at-state-b", + "bg-motorway", + "bg-national", + "ch-main", + "ch-motorway", + "cz-motorway", + "cz-road", + "de-motorway", + "e-road", + "fi-main", + "gr-motorway", + "gr-national", + "hr-motorway", + "hr-state", + "hu-main", + "hu-motorway", + "nz-state", + "pl-expressway", + "pl-motorway", + "pl-national", + "ro-county", + "ro-motorway", + "ro-national", + "rs-motorway", + "rs-state-1b", + "se-main", + "si-expressway", + "si-motorway", + "sk-highway", + "sk-road", + "us-interstate", + "us-interstate-business", + "us-interstate-duplex", + "us-interstate-truck", + "za-metropolitan", + "za-national", + "za-provincial", + "za-regional" + ], + ["<=", "reflen", 6] + ], + "layout": { + "text-size": 9, + "icon-image": "{shield}-{reflen}", + "icon-rotation-alignment": "viewport", + "text-max-angle": 38, + "symbol-spacing": {"base": 1, "stops": [[11, 150], [14, 200]]}, + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "symbol-placement": { + "base": 1, + "stops": [[10, "point"], [11, "line"]] + }, + "text-padding": 2, + "text-rotation-alignment": "viewport", + "text-field": "{ref}", + "text-letter-spacing": 0.05, + "icon-padding": 2 + }, + "paint": { + "text-color": "hsl(230, 21%, 37%)", + "icon-halo-color": "rgba(0, 0, 0, 1)", + "icon-halo-width": 1, + "text-opacity": 1, + "icon-color": "white", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 0 + }, + "interactive": true + }, + { + "id": "road-shields-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444933575858.6992"}, + "source": "composite", + "source-layer": "road_label", + "filter": [ + "all", + ["<=", "reflen", 6], + [ + "in", + "shield", + "at-expressway", + "at-motorway", + "at-state-b", + "bg-motorway", + "bg-national", + "ch-main", + "ch-motorway", + "cz-motorway", + "cz-road", + "de-motorway", + "e-road", + "fi-main", + "gr-motorway", + "gr-national", + "hr-motorway", + "hr-state", + "hu-main", + "hu-motorway", + "nz-state", + "pl-expressway", + "pl-motorway", + "pl-national", + "ro-county", + "ro-motorway", + "ro-national", + "rs-motorway", + "rs-state-1b", + "se-main", + "si-expressway", + "si-motorway", + "sk-highway", + "sk-road", + "us-interstate", + "us-interstate-business", + "us-interstate-duplex", + "us-interstate-truck", + "za-metropolitan", + "za-national", + "za-provincial", + "za-regional" + ] + ], + "layout": { + "text-size": 9, + "icon-image": "{shield}-{reflen}", + "icon-rotation-alignment": "viewport", + "text-max-angle": 38, + "symbol-spacing": {"base": 1, "stops": [[11, 150], [14, 200]]}, + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "symbol-placement": { + "base": 1, + "stops": [[10, "point"], [11, "line"]] + }, + "text-padding": 2, + "text-rotation-alignment": "viewport", + "text-field": "{ref}", + "text-letter-spacing": 0.05, + "icon-padding": 2 + }, + "paint": { + "text-color": "hsl(0, 0%, 100%)", + "icon-halo-color": "rgba(0, 0, 0, 1)", + "icon-halo-width": 1, + "text-opacity": 1, + "icon-color": "white", + "text-halo-color": "hsl(0, 0%, 59%)" + }, + "interactive": true + }, + { + "id": "motorway-junction", + "type": "symbol", + "metadata": {"mapbox:group": "1444933575858.6992"}, + "source": "composite", + "source-layer": "motorway_junction", + "minzoom": 14, + "filter": [">", "reflen", 0], + "layout": { + "text-field": "{ref}", + "text-size": 9, + "icon-image": "motorway-exit-{reflen}", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"] + }, + "paint": { + "text-color": "hsl(0, 0%, 100%)", + "text-translate": [0, 0] + }, + "interactive": true + }, + { + "id": "laavut-kodat", + "type": "symbol", + "source": "composite", + "source-layer": "Laavut-kodat", + "minzoom": 12, + "layout": { + "visibility": "visible", + "text-field": "{name}", + "icon-image": "campsite-11", + "text-offset": [0, 0.9], + "text-size": 11, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-anchor": "top" + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-opacity": {"base": 1, "stops": [[11, 0], [11.25, 1]]}, + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-outdoor-features", + "type": "symbol", + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "in", + "maki", + "bicycle", + "bicycle-share", + "drinking-water", + "information", + "picnic-site", + "toilet" + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[13, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "mountain-peak-label", + "type": "symbol", + "source": "composite", + "source-layer": "mountain_peak_label", + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": "{maki}-15", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-offset": [0, 0.8], + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "mountain-peak-label-with-elevation", + "type": "symbol", + "source": "composite", + "source-layer": "mountain_peak_label", + "filter": [">", "elevation_m", 0], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": "{maki}-15", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-offset": [0, 0.8], + "text-anchor": "top", + "text-field": "{name_en}, {elevation_m}m", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-scalerank2", + "type": "symbol", + "metadata": {"mapbox:group": "1444933358918.2366"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 13, + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + ["==", "scalerank", 2] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[14, 10], [20, 14]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "text-transform": "none", + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "visibility": "visible", + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-parks-scalerank2", + "type": "symbol", + "metadata": {"mapbox:group": "1444933358918.2366"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + ["==", "scalerank", 2], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[14, 10], [20, 14]]}, + "icon-image": {"stops": [[14, "{maki}-11"], [15, "{maki}-15"]]}, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 1], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#434019", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "rail-label", + "type": "symbol", + "source": "composite", + "source-layer": "rail_station_label", + "minzoom": 12, + "filter": ["!=", "maki", "entrance"], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 11], [20, 13]]}, + "icon-image": "{network}", + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-offset": [0, 1.2], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": { + "base": 1, + "stops": [[0, ""], [13, "{name_en}"]] + }, + "text-letter-spacing": 0.01, + "icon-padding": 0, + "text-max-width": 7 + }, + "paint": { + "text-color": "#434019", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 0.5, + "icon-halo-width": 4, + "icon-halo-color": "#fff", + "text-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "water-label-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444933808272.805"}, + "source": "composite", + "source-layer": "water_label", + "minzoom": 15, + "filter": ["<=", "area", 10000], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-max-width": 7, + "text-size": {"base": 1, "stops": [[16, 13], [20, 16]]} + }, + "paint": {"text-color": "#657f9f"}, + "interactive": true + }, + { + "id": "water-label", + "type": "symbol", + "metadata": {"mapbox:group": "1444933808272.805"}, + "source": "composite", + "source-layer": "water_label", + "minzoom": 5, + "filter": [">", "area", 10000], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-max-width": 7, + "text-size": {"base": 1, "stops": [[13, 13], [18, 18]]} + }, + "paint": { + "text-color": "hsl(213, 27%, 55%)", + "text-halo-color": "hsla(0, 0%, 100%, 0)", + "text-halo-width": 0 + }, + "interactive": true + }, + { + "id": "poi-parks-scalerank1", + "type": "symbol", + "metadata": {"mapbox:group": "1444933322393.2852"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + ["<=", "scalerank", 1], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": {"stops": [[13, "{maki}-11"], [14, "{maki}-15"]]}, + "text-max-angle": 38, + "text-transform": "none", + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0.9], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-blur": 0.5, + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "poi-scalerank1", + "type": "symbol", + "metadata": {"mapbox:group": "1444933322393.2852"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + ["<=", "scalerank", 1] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "visibility": "visible", + "text-offset": [0, 0.7], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "airport-label", + "type": "symbol", + "source": "composite", + "source-layer": "airport_label", + "minzoom": 9, + "filter": ["<=", "scalerank", 2], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 12], [18, 18]]}, + "icon-image": {"stops": [[12, "{maki}-11"], [13, "{maki}-15"]]}, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0.75], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": {"stops": [[11, "{ref}"], [12, "{name_en}"]]}, + "text-letter-spacing": 0.01, + "text-max-width": 9 + }, + "paint": { + "text-color": "#434019", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "place-islet-archipelago-aboriginal", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": [ + "in", + "type", + "aboriginal_lands", + "archipelago", + "islet" + ], + "layout": { + "text-line-height": 1.2, + "text-size": {"base": 1, "stops": [[10, 11], [18, 16]]}, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0], + "text-rotation-alignment": "viewport", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "place-neighbourhood", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": ["==", "type", "neighbourhood"], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[12, 8.5], [16, 14]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 3, + "visibility": "visible", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 7 + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-color": "#6a6b5e", + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "place-suburb", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": ["==", "type", "suburb"], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[11, 8.5], [15, 15]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 3, + "visibility": "visible", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 7 + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-color": "hsl(63, 6%, 39%)", + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "place-hamlet", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": ["==", "type", "hamlet"], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[12, 11.5], [15, 16]]} + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.5, + "text-color": "#232216", + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "place-village", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 8, + "maxzoom": 15, + "filter": ["==", "type", "village"], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-max-width": 7, + "text-size": {"base": 1, "stops": [[10, 11.5], [16, 18]]} + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-blur": 0.5, + "text-color": "#232216", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "place-town", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 6, + "maxzoom": 15, + "filter": ["==", "type", "town"], + "layout": { + "text-size": {"base": 1, "stops": [[7, 11.5], [15, 20]]}, + "text-font": { + "base": 1, + "stops": [ + [11, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [12, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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-image": "dot-9" + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "place-island", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": ["==", "type", "island"], + "layout": { + "text-line-height": 1.2, + "text-size": {"base": 1, "stops": [[10, 11], [18, 16]]}, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0], + "text-rotation-alignment": "viewport", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(56, 23%, 20%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "place-city-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + ["!in", "scalerank", 0, 1, 2, 3, 4, 5], + ["==", "type", "city"] + ], + "layout": { + "text-size": {"base": 1, "stops": [[6, 12], [14, 22]]}, + "icon-image": "dot-9", + "text-font": { + "base": 1, + "stops": [ + [7, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [8, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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 + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.25, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]} + }, + "interactive": true + }, + { + "id": "place-city-md-s", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + ["==", "type", "city"], + ["in", "ldir", "E", "S", "SE", "SW"], + ["in", "scalerank", 3, 4, 5] + ], + "layout": { + "text-field": "{name_en}", + "icon-image": "dot-10", + "text-anchor": { + "base": 1, + "stops": [[7, "top"], [8, "center"]] + }, + "text-offset": { + "base": 1, + "stops": [[7.99, [0, 0.1]], [8, [0, 0]]] + }, + "text-font": { + "base": 1, + "stops": [ + [7, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [8, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 0.9, "stops": [[5, 12], [12, 22]]} + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": "hsl(43, 100%, 97%)", + "text-color": "#232216", + "text-halo-blur": 1, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]} + }, + "interactive": true + }, + { + "id": "place-city-md-n", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + ["==", "type", "city"], + ["in", "ldir", "N", "NE", "NW", "W"], + ["in", "scalerank", 3, 4, 5] + ], + "layout": { + "icon-image": "dot-10", + "text-font": { + "base": 1, + "stops": [ + [7, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [8, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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, + "text-size": {"base": 0.9, "stops": [[5, 12], [12, 22]]} + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.5, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "place-city-lg-s", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + ["<=", "scalerank", 2], + ["==", "type", "city"], + ["in", "ldir", "E", "S", "SE", "SW"] + ], + "layout": { + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [6, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [7, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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, + "text-size": {"base": 0.9, "stops": [[4, 12], [10, 24]]} + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.5, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "place-city-lg-n", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + ["<=", "scalerank", 2], + ["==", "type", "city"], + ["in", "ldir", "N", "NE", "NW", "W"] + ], + "layout": { + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [6, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [7, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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, + "text-size": {"base": 0.9, "stops": [[4, 12], [10, 22]]} + }, + "paint": { + "text-color": "#232216", + "text-opacity": 1, + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.5, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "marine-label-sm-ln", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": [ + "all", + ["==", "$type", "LineString"], + [">=", "labelrank", 4] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[3, 12], [6, 16]]}, + "symbol-spacing": {"base": 1, "stops": [[4, 100], [6, 400]]}, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.1, + "text-max-width": 5 + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-sm-pt", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": ["all", ["==", "$type", "Point"], [">=", "labelrank", 4]], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.1, + "text-line-height": 1.5, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[3, 12], [6, 16]]} + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-md-ln", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["in", "labelrank", 2, 3] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1.1, "stops": [[2, 12], [5, 20]]}, + "symbol-spacing": 250, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-md-pt", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + ["==", "$type", "Point"], + ["in", "labelrank", 2, 3] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.15, + "text-line-height": 1.5, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1.1, "stops": [[2, 14], [5, 20]]} + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-lg-ln", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "labelrank", 1] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.1, + "symbol-placement": "line", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[1, 14], [4, 30]]} + }, + "paint": {"text-color": "hsl(213, 27%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-lg-pt", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": ["all", ["==", "$type", "Point"], ["==", "labelrank", 1]], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.5, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[1, 14], [4, 30]]} + }, + "paint": {"text-color": "#abbbcf"}, + "interactive": true + }, + { + "id": "state-label-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444856151690.9143"}, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 8, + "filter": ["<", "area", 20000], + "layout": { + "text-size": {"base": 1, "stops": [[6, 10], [9, 14]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "text-field": { + "base": 1, + "stops": [[0, "{abbr}"], [6, "{name_en}"]] + }, + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(49, 20%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "state-label-md", + "type": "symbol", + "metadata": {"mapbox:group": "1444856151690.9143"}, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 8, + "filter": ["all", ["<", "area", 80000], [">=", "area", 20000]], + "layout": { + "text-size": {"base": 1, "stops": [[5, 10], [8, 16]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "text-field": { + "base": 1, + "stops": [[0, "{abbr}"], [5, "{name_en}"]] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(49, 20%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "state-label-lg", + "type": "symbol", + "metadata": {"mapbox:group": "1444856151690.9143"}, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 7, + "filter": [">=", "area", 80000], + "layout": { + "text-size": {"base": 1, "stops": [[4, 10], [7, 18]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "text-padding": 1, + "text-field": { + "base": 1, + "stops": [[0, "{abbr}"], [4, "{name_en}"]] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(49, 20%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "country-label-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444856144497.7825"}, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 10, + "filter": [">=", "scalerank", 5], + "layout": { + "text-field": "{name_en}", + "text-max-width": 6, + "text-font": { + "base": 1, + "stops": [ + [0, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [5, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 0.9, "stops": [[5, 14], [9, 22]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(50, 45%, 16%)", + "text-halo-color": "hsl(36, 75%, 96%)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "country-label-md", + "type": "symbol", + "metadata": {"mapbox:group": "1444856144497.7825"}, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 8, + "filter": ["in", "scalerank", 3, 4], + "layout": { + "text-field": { + "base": 1, + "stops": [[0, "{code}"], [2, "{name_en}"]] + }, + "text-max-width": 6, + "text-font": { + "base": 1, + "stops": [ + [0, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [5, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 1, "stops": [[3, 10], [8, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(50, 45%, 16%)", + "text-halo-color": "hsl(36, 75%, 96%)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "country-label-lg", + "type": "symbol", + "metadata": {"mapbox:group": "1444856144497.7825"}, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 7, + "filter": ["in", "scalerank", 1, 2], + "layout": { + "text-field": "{name_en}", + "text-max-width": {"base": 1, "stops": [[0, 5], [3, 6]]}, + "text-font": { + "base": 1, + "stops": [ + [0, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [5, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 1, "stops": [[1, 10], [6, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(50, 45%, 16%)", + "text-halo-color": "hsl(36, 75%, 96%)", + "text-halo-width": 1 + }, + "interactive": true + } + ], + "created": "2016-07-15T11:48:31.825Z", + "id": "ciqnol3nm002fc5lvsyci972q", + "modified": "2018-11-21T17:07:08.359Z", + "owner": "asdigital", + "visibility": "private", + "draft": false +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/MainActivity.kt b/mapbox/src/main/java/com/example/mapbox/MainActivity.kt new file mode 100644 index 0000000000..90e76a1f48 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/MainActivity.kt @@ -0,0 +1,153 @@ +package com.example.mapbox + +import android.annotation.SuppressLint +import android.location.Location +import android.os.Bundle +import android.os.SystemClock +import android.support.constraint.ConstraintLayout +import android.support.wearable.activity.WearableActivity +import android.util.Log +import android.widget.Toast +import androidx.lifecycle.Observer +import com.example.mapbox.ui.MapboxMapView +import com.example.mapbox.ui.extensions.addViewAndMatchItToParent +import com.mapbox.android.core.permissions.PermissionsListener +import com.mapbox.android.core.permissions.PermissionsManager +import com.mapbox.mapboxsdk.Mapbox +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback +import com.mapbox.mapboxsdk.testapp.R +import com.soy.android.maps.compass.WassCompassEngine +import com.soy.android.maps.livedata.MapViewSensors +import dagger.android.AndroidInjection +import javax.inject.Inject + +class MainActivity : WearableActivity(), PermissionsListener, OnMapReadyCallback { + override fun onMapReady(mapboxMap: MapboxMap) { + measureAndPrintTimeMillis("onStart.requestSensorUpdates") { + requestSensorUpdates() + } + mapboxMapView.onMapReady(mapboxMap) + } + + private lateinit var mapboxMapView: MapboxMapView + + @Inject + lateinit var sensors: MapViewSensors + + @SuppressLint("MissingPermission") + override fun onCreate(savedInstanceState: Bundle?) { + AndroidInjection.inject(this) + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + if (PermissionsManager.areLocationPermissionsGranted(this)) { + createMapboxMapView() + } else { + PermissionsManager(this).requestLocationPermissions(this) + } + setAmbientEnabled() + } + + private fun createMapboxMapView() { + Mapbox.getInstance(this, getString(R.string.mapbox_api_key)) + val location = sensors.locationLiveData.value + val root = findViewById<ConstraintLayout>(R.id.content) + mapboxMapView = MapboxMapView(this, location).apply { + compassEngine = WassCompassEngine(sensors.headingLiveData) + root.addViewAndMatchItToParent(this) + onCreate(null) + getMapAsync(this@MainActivity) + } + } + + public override fun onResume() { + super.onResume() + measureAndPrintTimeMillis("onResume") { + mapboxMapView.onResume() + } + } + + public override fun onPause() { + super.onPause() + measureAndPrintTimeMillis("onPause") { + mapboxMapView.onPause() + } + } + + override fun onLowMemory() { + super.onLowMemory() + measureAndPrintTimeMillis("onLowMemory") { + mapboxMapView.onLowMemory() + } + } + + override fun onStart() { + super.onStart() + measureAndPrintTimeMillis("onStart.mapOnStart") { + mapboxMapView.onStart() + } + } + + override fun onStop() { + super.onStop() + removeSensorUpdates() + measureAndPrintTimeMillis("onStop") { + mapboxMapView.onStop() + } + } + + override fun onDestroy() { + super.onDestroy() + measureAndPrintTimeMillis("onDestroy") { + mapboxMapView.onDestroy() + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + measureAndPrintTimeMillis("onSaveInstanceState") { + mapboxMapView.onSaveInstanceState(outState) + } + } + + private fun requestSensorUpdates() { + sensors.requestUpdates(locationObserver) + mapboxMapView.compassEngine?.requestUpdates() + } + + private fun removeSensorUpdates() { + sensors.removeUpdates(locationObserver) + mapboxMapView.compassEngine?.removeUpdates() + } + + // Sensors + private val locationObserver: Observer<Location> = Observer { location -> + measureAndPrintTimeMillis("onNewLocation") { + mapboxMapView.onNewLocation(location) + } + } + + override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) { + Toast.makeText(this, R.string.user_location_permission_explanation, Toast.LENGTH_LONG).show() + } + + override fun onPermissionResult(granted: Boolean) { + if (granted) { + createMapboxMapView() + } else { + Toast.makeText(this, R.string.user_location_permission_not_granted, Toast.LENGTH_LONG).show() + } + } +} + +/** + * Executes the given [block] and returns elapsed time in milliseconds. + */ +public inline fun <T> measureAndPrintTimeMillis(blockName: String, block: () -> T): T { + val start = SystemClock.elapsedRealtime() + val t = block() + val elapsedTime = SystemClock.elapsedRealtime() - start + Log.d("MapExample", "It took $elapsedTime ms to run [$blockName]") + return t +} + diff --git a/mapbox/src/main/java/com/example/mapbox/MainActivityModule.kt b/mapbox/src/main/java/com/example/mapbox/MainActivityModule.kt new file mode 100644 index 0000000000..eec66ebee3 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/MainActivityModule.kt @@ -0,0 +1,10 @@ +package com.example.mapbox + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class MainActivityModule { + @ContributesAndroidInjector + internal abstract fun mainActivity(): MainActivity +} diff --git a/mapbox/src/main/java/com/example/mapbox/MapboxApp.kt b/mapbox/src/main/java/com/example/mapbox/MapboxApp.kt new file mode 100644 index 0000000000..ded4931802 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/MapboxApp.kt @@ -0,0 +1,16 @@ +package com.example.mapbox + +import dagger.android.AndroidInjector +import dagger.android.DaggerApplication + +class MapboxApp : DaggerApplication() { + private val appComponent: AndroidInjector<MapboxApp> by lazy { + DaggerAppComponent + .builder() + .create(this) + } + + override fun applicationInjector(): AndroidInjector<out DaggerApplication> { + return appComponent + } +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/breadcrumb/Breadcrumb.kt b/mapbox/src/main/java/com/example/mapbox/breadcrumb/Breadcrumb.kt new file mode 100644 index 0000000000..af27cc36b6 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/breadcrumb/Breadcrumb.kt @@ -0,0 +1,157 @@ +package com.soy.android.maps.breadcrumb + +import android.content.res.Resources +import com.example.mapbox.breadcrumb.ExerciseEngineState +import com.example.mapbox.ui.MapboxMapView +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.location.OnLocationStaleListener +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.Style +import com.mapbox.mapboxsdk.plugins.annotation.Line +import com.mapbox.mapboxsdk.plugins.annotation.LineManager +import com.mapbox.mapboxsdk.plugins.annotation.SymbolManager +import timber.log.Timber + +/** + * Note that this is not public API and taken from [com.mapbox.mapboxsdk.location.LocationComponentConstants]. Needed + * to be hardcoded to have the line layer below the location indicator + */ +private const val LOCATION_INDICATOR_BACKGROUND_LAYER_ID = "mapbox-location-stroke-layer" + +class Breadcrumb( + mapView: MapboxMapView, + private val map: MapboxMap, + style: Style +) : OnLocationStaleListener { + + private val lineManager: LineManager = LineManager(mapView, map, style, LOCATION_INDICATOR_BACKGROUND_LAYER_ID) + private val symbolManager: SymbolManager = SymbolManager(mapView, map, style, LOCATION_INDICATOR_BACKGROUND_LAYER_ID) + private val resources: Resources + + init { + map.locationComponent.addOnLocationStaleListener(this) + resources = mapView.resources + } + + /** + * Flag that represents whether start symbol is created + */ + private var startSymbolCreated = false + + /** + * Holds [LatLng] list of current recording state line. A recording state line is the line which holds the list of + * [LatLng] recorded during [Recording] state. When state is [Paused] last recording state line does not receive + * updates and when the state is [Recording] after [Paused] state a new line is created and that line is updated + * according to [currentRecordingStateLatLngs] + */ + private var currentRecordingStateLatLngs = mutableListOf<LatLng>() + + /** + * A recording state line is the line which is created and updated during [Recording] state. + * + * When state is [Paused] last recording state line does not receive updates. + * + * [currentRecordingStateLine] is the line which is created either at the beginning of the exercise or when the + * state is [Recording] again after last [Paused] state. + */ + private var currentRecordingStateLine: Line? = null + + /** + * The [ExerciseEngineState] which belongs to the previous [com.soy.android.maps.livedata.StatefulLocation] + */ + private var previousExerciseEngineState: ExerciseEngineState? = null + + private var fromStaleState = false + + private var isMapViewVisible = true + + internal fun onNewLocation(latLng: LatLng, exerciseEngineState: ExerciseEngineState?) { + if (!startSymbolCreated) { + // We create a start symbol when the exercise is started + symbolManager.addStartExerciseSymbol(latLng) + startSymbolCreated = true + previousExerciseEngineState = exerciseEngineState + return + } + when { + exerciseRecording(exerciseEngineState) -> { + if (fromStaleState) { + fromStaleState = false + map.locationComponent.addOnLocationStaleListener(this) + lineManager.createStaleStateLine(listOf(currentRecordingStateLatLngs.last(), latLng)) + // clear the recording state latlng list and add the start point for the new line + currentRecordingStateLatLngs.clear() + currentRecordingStateLatLngs.add(latLng) + } else { + currentRecordingStateLatLngs.add(latLng) + createOrUpdateRecordingLine() + } + } + exercisePaused(exerciseEngineState) -> { + // add the end point for currentRecordingStateLine + currentRecordingStateLatLngs.add(latLng) + createOrUpdateRecordingLine() + // add the start point of the pause line + } + exerciseResumed(exerciseEngineState) -> { + // add the end point of the pause line + // create the pause line + lineManager.createPausedStateLine(listOf(currentRecordingStateLatLngs.last(), latLng)) + Timber.d("Pause state line is created") + // after we create the pause line we clear pauseLinePoints for next possible pause line + // clear the recording state latlng list and add the start point for the new line + currentRecordingStateLatLngs.clear() + currentRecordingStateLatLngs.add(latLng) + createOrUpdateRecordingLine() + } + } + previousExerciseEngineState = exerciseEngineState + } + + private fun createOrUpdateRecordingLine() { + currentRecordingStateLine?.let { + // we update the latlng list for currentRecordingStateLine + it.latLngs = currentRecordingStateLatLngs + // We update the currentRecordingStateLine only when the mapview is visible + if (isMapViewVisible) { + lineManager.update(it) + Timber.d("Recording state line is updated") + } + } ?: run { + if (currentRecordingStateLatLngs.size > 1) { + Timber.d("Recording state line is created") + currentRecordingStateLine = lineManager.createRecordingStateLine(currentRecordingStateLatLngs) + } + } + } + + private fun exerciseResumed(exerciseEngineState: ExerciseEngineState?) = + previousExerciseEngineState == ExerciseEngineState.Paused && exerciseEngineState == ExerciseEngineState.Recording + + private fun exercisePaused(exerciseEngineState: ExerciseEngineState?) = + previousExerciseEngineState == ExerciseEngineState.Recording && exerciseEngineState == ExerciseEngineState.Paused + + private fun exerciseRecording(exerciseEngineState: ExerciseEngineState?) = + previousExerciseEngineState == ExerciseEngineState.Recording && exerciseEngineState == ExerciseEngineState.Recording + + internal fun onDestroy() { + lineManager.onDestroy() + symbolManager.onDestroy() + } + + internal fun onResume() { + isMapViewVisible = true + createOrUpdateRecordingLine() + } + + internal fun onStop() { + isMapViewVisible = false + } + + override fun onStaleStateChange(isStale: Boolean) { + if (isStale) { + map.locationComponent.removeOnLocationStaleListener(this) + fromStaleState = isStale + } + } +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/breadcrumb/ExerciseEngineState.kt b/mapbox/src/main/java/com/example/mapbox/breadcrumb/ExerciseEngineState.kt new file mode 100644 index 0000000000..1d78bb7035 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/breadcrumb/ExerciseEngineState.kt @@ -0,0 +1,6 @@ +package com.example.mapbox.breadcrumb + +enum class ExerciseEngineState { + Paused, + Recording +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/compass/WassCompassEngine.kt b/mapbox/src/main/java/com/example/mapbox/compass/WassCompassEngine.kt new file mode 100644 index 0000000000..6795ea68c4 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/compass/WassCompassEngine.kt @@ -0,0 +1,48 @@ +package com.soy.android.maps.compass + +import android.hardware.SensorManager.SENSOR_STATUS_ACCURACY_HIGH +import androidx.lifecycle.Observer +import com.example.mapbox.livedata.HeadingSensorLiveData +import com.mapbox.mapboxsdk.location.CompassEngine +import com.mapbox.mapboxsdk.location.CompassListener + +class WassCompassEngine( + private val headingSensorLiveData: HeadingSensorLiveData? +) : CompassEngine { + + private val compassListeners = mutableListOf<CompassListener>() + + private var lastHeading: Float = 0.0f + + private val headingObserver: Observer<Float> = Observer { + lastHeading = Math.toDegrees(it.toDouble()).toFloat() + notifyCompassChangeListeners(lastHeading) + } + + /** + * Always returns [SENSOR_STATUS_ACCURACY_HIGH] and should not mean anything in this context + */ + override fun getLastAccuracySensorStatus() = SENSOR_STATUS_ACCURACY_HIGH + + override fun addCompassListener(compassListener: CompassListener) { + compassListeners.add(compassListener) + } + + override fun removeCompassListener(compassListener: CompassListener) { + compassListeners.remove(compassListener) + } + + override fun getLastHeading() = lastHeading + + fun requestUpdates() = headingSensorLiveData?.observeForever(headingObserver) + + fun removeUpdates() = headingSensorLiveData?.removeObserver(headingObserver) + + private fun notifyCompassChangeListeners(heading: Float) { + lastHeading = heading.apply { + for (compassListener in compassListeners) { + compassListener.onCompassChanged(this) + } + } + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/di/AppComponent.kt b/mapbox/src/main/java/com/example/mapbox/di/AppComponent.kt new file mode 100644 index 0000000000..039ca746c0 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/di/AppComponent.kt @@ -0,0 +1,19 @@ +import com.example.mapbox.MainActivityModule +import com.example.mapbox.MapboxApp +import dagger.Component +import dagger.android.AndroidInjector +import dagger.android.support.AndroidSupportInjectionModule +import javax.inject.Singleton + +/** + * Application component refers to application level modules only + */ +@Singleton +@Component(modules = [ + AndroidSupportInjectionModule::class, + MainActivityModule::class +]) +interface AppComponent : AndroidInjector<MapboxApp> { + @Component.Builder + abstract class Builder : AndroidInjector.Builder<MapboxApp>() +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/extensions/AnnotationsExtensions.kt b/mapbox/src/main/java/com/example/mapbox/extensions/AnnotationsExtensions.kt new file mode 100644 index 0000000000..be4f09d9ff --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/extensions/AnnotationsExtensions.kt @@ -0,0 +1,48 @@ +package com.soy.android.maps.breadcrumb + +import com.example.mapbox.ui.PAUSE_LINE_PATTERN +import com.example.mapbox.ui.START_SYMBOL_ICON_ID +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.plugins.annotation.* +import com.mapbox.mapboxsdk.style.layers.Property + +private const val MAP_LINE_WIDTH = 4f // In pixels +private const val COLOR_MAP_LINE_REGULAR = "#FF5640" +private const val COLOR_MAP_LINE_PAUSE = "#00000000" +private const val MAP_LINE_PAUSE_OPACITY = 0.2f + +internal fun SymbolManager.addStartExerciseSymbol(latLng: LatLng) { + val option = SymbolOptions() + .withLatLng(latLng) + .withIconImage(START_SYMBOL_ICON_ID) + this.create(option) +} + +internal fun LineManager.createRecordingStateLine(recordingStateLatLngs: List<LatLng>): Line { + lineCap = Property.LINE_CAP_BUTT + val lineOptions = LineOptions() + .withLatLngs(recordingStateLatLngs) + .withLineJoin(Property.LINE_JOIN_ROUND) + .withLineColor(COLOR_MAP_LINE_REGULAR) + .withLineWidth(MAP_LINE_WIDTH) + return this.create(lineOptions) +} + +internal fun LineManager.createPausedStateLine(startEndPoints: List<LatLng>): Line { + val lineOptions = LineOptions() + .withLatLngs(startEndPoints) + .withLineJoin(Property.LINE_JOIN_ROUND) + .withLineColor(COLOR_MAP_LINE_PAUSE) + .withLineWidth(MAP_LINE_WIDTH) + .withLinePattern(PAUSE_LINE_PATTERN) + return this.create(lineOptions) +} + +internal fun LineManager.createStaleStateLine(startEndPoints: List<LatLng>): Line { + val lineOptions = LineOptions() + .withLatLngs(startEndPoints) + .withLineJoin(Property.LINE_JOIN_ROUND) + .withLineColor(COLOR_MAP_LINE_REGULAR) + .withLineWidth(MAP_LINE_WIDTH) + return this.create(lineOptions) +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/extensions/LocationExtensions.kt b/mapbox/src/main/java/com/example/mapbox/extensions/LocationExtensions.kt new file mode 100644 index 0000000000..67bebf7504 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/extensions/LocationExtensions.kt @@ -0,0 +1,8 @@ +package com.example.mapbox.extensions + +import android.location.Location +import com.mapbox.mapboxsdk.geometry.LatLng + +fun Location.latLong(): LatLng { + return LatLng(latitude, longitude) +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/extensions/MapboxMapExtensions.kt b/mapbox/src/main/java/com/example/mapbox/extensions/MapboxMapExtensions.kt new file mode 100644 index 0000000000..eb863f9f64 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/extensions/MapboxMapExtensions.kt @@ -0,0 +1,22 @@ +package com.soy.android.maps.extensions + +import com.mapbox.mapboxsdk.location.modes.CameraMode +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.Style +import kotlinx.coroutines.suspendCancellableCoroutine +import timber.log.Timber +import kotlin.coroutines.resume + +fun MapboxMap.isCameraInTrackingMode() = getActivatedLocationComponent()?.run { + cameraMode == CameraMode.TRACKING_COMPASS || + cameraMode == CameraMode.TRACKING || + cameraMode == CameraMode.TRACKING_GPS || + cameraMode == CameraMode.TRACKING_GPS_NORTH +} + +fun MapboxMap.getActivatedLocationComponent() = locationComponent.takeIf { + it.isLocationComponentEnabled +} ?: run { + Timber.w("Calling location component, but it is not enabled.") + null +} diff --git a/mapbox/src/main/java/com/example/mapbox/extensions/ResourceExtensions.kt b/mapbox/src/main/java/com/example/mapbox/extensions/ResourceExtensions.kt new file mode 100644 index 0000000000..785ed32840 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/extensions/ResourceExtensions.kt @@ -0,0 +1,25 @@ +package com.example.mapbox.extensions + +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import androidx.annotation.DrawableRes + +fun Resources.getBitmapFromDrawable(@DrawableRes drawableResId: Int): Bitmap { + return getDrawable(drawableResId, null).getBitmapFromDrawable() +} + +fun Drawable.getBitmapFromDrawable(): Bitmap { + return if (this is BitmapDrawable) { + bitmap + } else { + val bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888) + Canvas(bitmap).let { + setBounds(0, 0, it.width, it.height) + draw(it) + bitmap + } + } +}
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/livedata/HeadingSensorLiveData.kt b/mapbox/src/main/java/com/example/mapbox/livedata/HeadingSensorLiveData.kt new file mode 100644 index 0000000000..4acbfb754a --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/livedata/HeadingSensorLiveData.kt @@ -0,0 +1,33 @@ +package com.example.mapbox.livedata + +import androidx.lifecycle.LiveData +import com.example.mapbox.mockdata.MockHeadingSensor +import kotlinx.coroutines.* +import javax.inject.Inject + +private const val GPS_FIX_INTERVAL_MILLISEC = 1000L + +class HeadingSensorLiveData @Inject constructor( + private val mockHeadingSensor: MockHeadingSensor +) : LiveData<Float>() { + + private val job = Job() + private val backgroundScope = CoroutineScope(Dispatchers.Default + job) + + override fun onActive() { + super.onActive() + backgroundScope.launch { + while(true) { + delay(GPS_FIX_INTERVAL_MILLISEC) + withContext(Dispatchers.Main) { + value = mockHeadingSensor.generateNextValue() + } + } + } + } + + override fun onInactive() { + job.cancel() + super.onInactive() + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/livedata/LocationSensorLiveData.kt b/mapbox/src/main/java/com/example/mapbox/livedata/LocationSensorLiveData.kt new file mode 100644 index 0000000000..c58f9d39e9 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/livedata/LocationSensorLiveData.kt @@ -0,0 +1,35 @@ +package com.soy.android.maps.livedata + +import android.location.Location +import androidx.lifecycle.LiveData +import com.asoy.wass.sdk.android.sensor.MockLocationSensor +import kotlinx.coroutines.* +import javax.inject.Inject + +private const val HEADING_INTERVAL_MILLISEC = 500L + +class LocationSensorLiveData +@Inject constructor( + private val mockLocationSensor: MockLocationSensor +) : LiveData<Location>() { + + private val job = Job() + private val backgroundScope = CoroutineScope(Dispatchers.Default + job) + + override fun onActive() { + super.onActive() + backgroundScope.launch { + while (true) { + delay(HEADING_INTERVAL_MILLISEC) + withContext(Dispatchers.Main) { + value = mockLocationSensor.generateNextValue() + } + } + } + } + + override fun onInactive() { + job.cancel() + super.onInactive() + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/livedata/LocationWithHeadingLiveData.kt b/mapbox/src/main/java/com/example/mapbox/livedata/LocationWithHeadingLiveData.kt new file mode 100644 index 0000000000..2d09e9bfd5 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/livedata/LocationWithHeadingLiveData.kt @@ -0,0 +1,30 @@ +package com.example.mapbox.livedata + +import android.location.Location +import androidx.lifecycle.MediatorLiveData +import com.soy.android.maps.livedata.LocationSensorLiveData +import javax.inject.Inject + +/** + * [MediatorLiveData] wrapper used to expose the [AndroidLocation]. + * + * The value is mediated based on the last recorded values of [LocationSensorLiveData] + * and [HeadingSensorLiveData], and each time [LocationSensorLiveData] emits a value + * a new [AndroidLocation] value is emitted by this mediator live data. Note that if + */ +class LocationWithHeadingLiveData +@Inject constructor( + headingSensorLiveData: HeadingSensorLiveData, + locationSensorLiveData: LocationSensorLiveData +) : MediatorLiveData<Location>() { + init { + addSource(locationSensorLiveData) { + headingSensorLiveData.value?.let {heading -> + // Convert radian to degree + it.bearing = Math.toDegrees(heading.toDouble()).toFloat() + value = it + } + } + addSource(headingSensorLiveData) {} + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/livedata/MapViewSensors.kt b/mapbox/src/main/java/com/example/mapbox/livedata/MapViewSensors.kt new file mode 100644 index 0000000000..8b56fff3f6 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/livedata/MapViewSensors.kt @@ -0,0 +1,37 @@ +package com.soy.android.maps.livedata + +import android.location.Location +import androidx.lifecycle.Observer +import com.example.mapbox.livedata.HeadingSensorLiveData +import com.example.mapbox.livedata.LocationWithHeadingLiveData +import javax.inject.Inject + +class MapViewSensors +@Inject constructor( + val locationLiveData: LocationWithHeadingLiveData, + val headingLiveData: HeadingSensorLiveData +) { + fun requestUpdates( + locationObserver: Observer<Location>? = null, + headingObserver: Observer<Float>? = null + ) { + locationObserver?.let { + locationLiveData.observeForever(it) + } + headingObserver?.let { + headingLiveData.observeForever(it) + } + } + + fun removeUpdates( + locationObserver: Observer<Location>? = null, + headingObserver: Observer<Float>? = null + ) { + locationObserver?.let { + locationLiveData.removeObserver(it) + } + headingObserver?.let { + headingLiveData.removeObserver(it) + } + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/mockdata/MockHeadingSensor.kt b/mapbox/src/main/java/com/example/mapbox/mockdata/MockHeadingSensor.kt new file mode 100644 index 0000000000..9029d89f29 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/mockdata/MockHeadingSensor.kt @@ -0,0 +1,18 @@ +package com.example.mapbox.mockdata + +import javax.inject.Inject + +class MockHeadingSensor +@Inject constructor() { + + private var heading: Float = 0f + + fun generateNextValue(): Float { + // Rotate 90deg in 10 seconds + heading += 0.1570796326794f + if (heading >= 2.0f * Math.PI.toFloat()) { + heading = 0.0f + } + return heading + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/mockdata/MockLocationSensor.kt b/mapbox/src/main/java/com/example/mapbox/mockdata/MockLocationSensor.kt new file mode 100644 index 0000000000..26d97ba450 --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/mockdata/MockLocationSensor.kt @@ -0,0 +1,31 @@ +package com.asoy.wass.sdk.android.sensor + +import android.location.Location +import android.location.LocationManager +import javax.inject.Inject + +class MockLocationSensor +@Inject constructor() { + + private var currentPosition = 0 + private var step = 1 + + fun generateNextValue(): Location { + val lat = lats[currentPosition] + val long = longs[currentPosition] + currentPosition += step + if (currentPosition >= lats.size) { + step = -1 + currentPosition = lats.size - 1 + } else if (currentPosition <= 0) { + step = 1 + currentPosition = 0 + } + return Location(LocationManager.GPS_PROVIDER).also { location -> + location.accuracy = 0.0f + location.latitude = lat + location.longitude = long + location.altitude = 0.0 + } + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/mockdata/MockLocations.kt b/mapbox/src/main/java/com/example/mapbox/mockdata/MockLocations.kt new file mode 100644 index 0000000000..4d1c4fe6dc --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/mockdata/MockLocations.kt @@ -0,0 +1,661 @@ +package com.asoy.wass.sdk.android.sensor + +// This is just a list of extracted latitudes and longitudes from a real exercise + +internal val lats = listOf(60.22488, 60.22492, 60.22495, 60.22497, 60.225, 60.22502, 60.22505, + 60.22507, 60.22509, 60.22513, 60.22515, 60.22518, 60.2252, 60.22523, 60.22525, 60.22527, + 60.22529, 60.22532, 60.22534, 60.22536, 60.22538, 60.22541, 60.22552, 60.22563, 60.22571, + 60.22576, 60.22579, 60.22587, 60.22597, 60.226, 60.2261, 60.22612, 60.22615, 60.22618, + 60.22622, 60.22627, 60.22629, 60.22631, 60.22633, 60.22635, 60.22637, 60.22639, 60.22642, + 60.22644, 60.22649, 60.22653, 60.2266, 60.22668, 60.22672, 60.22675, 60.22683, 60.22686, + 60.22688, 60.22693, 60.22694, 60.22702, 60.22707, 60.22711, 60.22713, 60.22714, 60.22716, + 60.22717, 60.22718, 60.22719, 60.2272, 60.22722, 60.22723, 60.22724, 60.22724, 60.22725, + 60.22727, 60.22729, 60.2273, 60.22732, 60.22733, 60.22734, 60.22738, 60.2274, 60.22741, + 60.22745, 60.22747, 60.22749, 60.2275, 60.22752, 60.22757, 60.22761, 60.22763, 60.22765, + 60.22767, 60.22768, 60.2277, 60.22771, 60.22772, 60.22773, 60.22775, 60.2278, 60.22782, + 60.22782, 60.22782, 60.22783, 60.22782, 60.22782, 60.22782, 60.2278, 60.22778, 60.22778, + 60.22777, 60.22778, 60.22778, 60.22778, 60.22779, 60.22779, 60.2278, 60.2278, 60.22783, + 60.22783, 60.22784, 60.22784, 60.22784, 60.22784, 60.22784, 60.22784, 60.22785, 60.22787, + 60.22788, 60.22788, 60.22788, 60.22788, 60.22787, 60.22788, 60.22788, 60.22789, 60.22792, + 60.22795, 60.22796, 60.22795, 60.22793, 60.22795, 60.22795, 60.22794, 60.22793, 60.22791, + 60.22789, 60.22787, 60.22786, 60.22784, 60.22783, 60.2278, 60.22779, 60.22775, 60.22774, + 60.22773, 60.22772, 60.22771, 60.2277, 60.22768, 60.22765, 60.22764, 60.22761, 60.2276, + 60.2276, 60.2276, 60.22759, 60.22758, 60.22757, 60.22756, 60.22756, 60.22755, 60.22755, + 60.22754, 60.22753, 60.22752, 60.22752, 60.22752, 60.22753, 60.22754, 60.22755, 60.22756, + 60.22756, 60.22756, 60.22756, 60.22757, 60.22758, 60.22759, 60.22761, 60.22763, 60.22765, + 60.22766, 60.22767, 60.22768, 60.22769, 60.22769, 60.22771, 60.22773, 60.22774, 60.22776, + 60.22777, 60.2278, 60.22782, 60.22783, 60.22785, 60.22786, 60.22788, 60.2279, 60.22792, + 60.22793, 60.22795, 60.22796, 60.22798, 60.22799, 60.22801, 60.22802, 60.22803, 60.22804, + 60.22806, 60.22807, 60.22808, 60.22809, 60.2281, 60.2281, 60.22811, 60.22811, 60.22812, + 60.22813, 60.22813, 60.22813, 60.22815, 60.22817, 60.22818, 60.22818, 60.22819, 60.2282, + 60.22821, 60.22821, 60.22821, 60.22822, 60.22823, 60.22823, 60.22824, 60.22824, 60.22824, + 60.22824, 60.22825, 60.22825, 60.22826, 60.22826, 60.22827, 60.22827, 60.22827, 60.22827, + 60.22826, 60.22826, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, + 60.22825, 60.22825, 60.22825, 60.22825, 60.22826, 60.22826, 60.22826, 60.22826, 60.22826, + 60.22826, 60.22826, 60.22826, 60.22826, 60.22826, 60.22825, 60.22825, 60.22825, 60.22825, + 60.22825, 60.22824, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, 60.22826, 60.22826, + 60.22827, 60.22827, 60.22828, 60.22829, 60.22831, 60.22832, 60.22833, 60.22834, 60.22835, + 60.22838, 60.22839, 60.2284, 60.22841, 60.22843, 60.22844, 60.22845, 60.22846, 60.22848, + 60.22849, 60.2285, 60.22851, 60.22851, 60.22852, 60.22853, 60.22854, 60.22854, 60.2285, + 60.22847, 60.22845, 60.22843, 60.2284, 60.22838, 60.22835, 60.22832, 60.22829, 60.22826, + 60.22823, 60.2282, 60.22809, 60.22799, 60.2279, 60.22787, 60.22784, 60.22781, 60.22779, + 60.22776, 60.22774, 60.22771, 60.22768, 60.22765, 60.22763, 60.2276, 60.22757, 60.22755, + 60.22752, 60.22747, 60.22744, 60.22741, 60.22738, 60.22736, 60.22733, 60.2273, 60.2272, + 60.2271, 60.22699, 60.2269, 60.2268, 60.22669, 60.22662, 60.22654, 60.22652, 60.22648, + 60.22646, 60.22645, 60.22642, 60.22639, 60.22637, 60.22636, 60.22627, 60.22618, 60.2261, + 60.22602, 60.22594, 60.22591, 60.22588, 60.22585, 60.22583, 60.2258, 60.22578, 60.22575, + 60.22573, 60.22571, 60.2257, 60.22568, 60.22567, 60.22566, 60.22566, 60.22568, 60.22572, + 60.22573, 60.22576, 60.22579, 60.22582, 60.22585, 60.22587, 60.2259, 60.22592, 60.22594, + 60.22595, 60.22596, 60.22597, 60.22599, 60.22601, 60.22604, 60.22605, 60.22607, 60.22608, + 60.2261, 60.22611, 60.22613, 60.22614, 60.22616, 60.22619, 60.22622, 60.22624, 60.22625, + 60.22626, 60.22629, 60.22633, 60.22635, 60.22637, 60.2264, 60.22643, 60.22647, 60.22649, + 60.22651, 60.22652, 60.22654, 60.22655, 60.22658, 60.22659, 60.22661, 60.22662, 60.22665, + 60.22666, 60.22668, 60.2267, 60.22671, 60.22673, 60.22675, 60.22677, 60.2268, 60.22682, + 60.22689, 60.22691, 60.22694, 60.22696, 60.22699, 60.22702, 60.22704, 60.22706, 60.22709, + 60.22712, 60.22714, 60.22722, 60.22727, 60.22732, 60.22736, 60.22739, 60.22742, 60.22744, + 60.22748, 60.22751, 60.22754, 60.22756, 60.22759, 60.22762, 60.22765, 60.22767, 60.2277, + 60.22772, 60.22774, 60.22776, 60.22778, 60.2278, 60.22782, 60.22784, 60.22786, 60.22787, + 60.22789, 60.22791, 60.22793, 60.22795, 60.22797, 60.228, 60.22802, 60.22804, 60.22807, + 60.22811, 60.22814, 60.22818, 60.2282, 60.22823, 60.22825, 60.22827, 60.22829, 60.22831, + 60.22834, 60.22837, 60.22839, 60.22841, 60.22844, 60.22845, 60.22847, 60.22849, 60.22855, + 60.22858, 60.2286, 60.22863, 60.22866, 60.22869, 60.22872, 60.22875, 60.22877, 60.22881, + 60.22884, 60.22886, 60.22888, 60.22892, 60.22895, 60.22897, 60.22899, 60.22903, 60.22906, + 60.22909, 60.22913, 60.22917, 60.22922, 60.22925, 60.22928, 60.22931, 60.22935, 60.22938, + 60.22942, 60.22945, 60.22948, 60.22951, 60.22954, 60.22957, 60.2296, 60.22962, 60.22965, + 60.22968, 60.22978, 60.22986, 60.22987, 60.22989, 60.2299, 60.22992, 60.22995, 60.22997, + 60.22999, 60.23001, 60.23003, 60.23005, 60.23011, 60.23014, 60.2302, 60.23029, 60.23033, + 60.23038, 60.23042, 60.23043, 60.23045, 60.23046, 60.23045, 60.23043, 60.23043, 60.2304, + 60.23038, 60.23034, 60.2303, 60.23029, 60.23025, 60.2302, 60.23015, 60.23014, 60.23008, + 60.23001, 60.22994, 60.22987, 60.22982, 60.22978, 60.22976, 60.22973, 60.22969, 60.22962, + 60.22955, 60.22945, 60.22938, 60.22929, 60.22926, 60.22923, 60.22921, 60.22919, 60.22917, + 60.22916, 60.22913, 60.22912, 60.2291, 60.22909, 60.22905, 60.22899, 60.22893, 60.22889, + 60.22886, 60.22882, 60.22878, 60.22873, 60.22869, 60.22865, 60.22863, 60.22863, 60.22862, + 60.22862, 60.22861, 60.2286, 60.22859, 60.22858, 60.22858, 60.22858, 60.22858, 60.22858, + 60.22858, 60.22858, 60.22858, 60.22858, 60.22858, 60.22859, 60.22859, 60.2286, 60.2286, + 60.2286, 60.2286, 60.22861, 60.2286, 60.22859, 60.22858, 60.22856, 60.22855, 60.22853, + 60.22852, 60.22851, 60.2285, 60.22848, 60.22841, 60.22839, 60.22836, 60.22834, 60.22832, + 60.22829, 60.22827, 60.22824, 60.22822, 60.2282, 60.22818, 60.22815, 60.22813, 60.22811, + 60.22808, 60.22805, 60.22802, 60.228, 60.22797, 60.22794, 60.22791, 60.22789, 60.22787, + 60.22784, 60.22782, 60.22779, 60.22777, 60.22774, 60.22771, 60.22769, 60.22766, 60.22764, + 60.22761, 60.22759, 60.22757, 60.22754, 60.22752, 60.2275, 60.22747, 60.22744, 60.22742, + 60.2274, 60.22738, 60.22736, 60.22734, 60.22732, 60.22729, 60.22727, 60.22725, 60.22722, + 60.22719, 60.22716, 60.22714, 60.22712, 60.22709, 60.22707, 60.22704, 60.22702, 60.22699, + 60.22697, 60.22694, 60.22692, 60.22689, 60.22687, 60.22684, 60.22682, 60.2268, 60.22677, + 60.22675, 60.22673, 60.2267, 60.22668, 60.22666, 60.22663, 60.22661, 60.22659, 60.22656, + 60.22654, 60.22651, 60.22649, 60.22647, 60.22645, 60.22642, 60.2264, 60.22638, 60.22635, + 60.22633, 60.22631, 60.22629, 60.22627, 60.22624, 60.22622, 60.2262, 60.22618, 60.22616, + 60.22614, 60.22612, 60.22606, 60.22601, 60.22599, 60.22598, 60.22597, 60.22595, 60.22595, + 60.22594, 60.22592, 60.22591, 60.2259, 60.22589, 60.22588, 60.22586, 60.22585, 60.22582, + 60.22581, 60.2258, 60.22578, 60.22578, 60.22576, 60.22575, 60.22574, 60.22573, 60.22571, + 60.2257, 60.22569, 60.22567, 60.22566, 60.22564, 60.22563, 60.22562, 60.22561, 60.2256, + 60.22558, 60.22557, 60.22555, 60.22554, 60.22552, 60.2255, 60.22548, 60.22547, 60.22546, + 60.22545, 60.22544, 60.22543, 60.22541, 60.22541, 60.2254, 60.22539, 60.22538, 60.22537, + 60.22536, 60.22535, 60.22534, 60.22532, 60.22532, 60.22531, 60.2253, 60.22528, 60.22527, + 60.22525, 60.22524, 60.22523, 60.22521, 60.2252, 60.22518, 60.22517, 60.22516, 60.22515, + 60.22513, 60.22512, 60.22511, 60.2251, 60.2251, 60.22509, 60.22509, 60.22508, 60.22507, + 60.22507, 60.22507, 60.22507, 60.22507, 60.22507, 60.22506, 60.22506, 60.22505, 60.22505, + 60.22504, 60.22503, 60.22503, 60.22502, 60.22502, 60.22501, 60.22501, 60.225, 60.225, + 60.225, 60.225, 60.22499, 60.22499, 60.22497, 60.22496, 60.22496, 60.22496, 60.22496, + 60.22496, 60.22495, 60.22495, 60.22493, 60.22491, 60.22491, 60.22491, 60.22491, 60.22491, + 60.22492, 60.22492, 60.22492, 60.22492, 60.22492, 60.22491, 60.2249, 60.22489, 60.22489, + 60.22488, 60.22488, 60.22488, 60.22486, 60.22485, 60.22484, 60.22484, 60.22483, 60.2248, + 60.22478, 60.22477, 60.22477, 60.22477, 60.22478, 60.22481, 60.22482, 60.22485, 60.22487, + 60.22488, 60.22489, 60.22489, 60.2249, 60.22491, 60.22492, 60.22492, 60.22493, 60.22494, + 60.22495, 60.22496, 60.22498, 60.22499, 60.22499, 60.225, 60.22501, 60.22501, 60.22501, + 60.22501, 60.22501, 60.22501, 60.22502, 60.22502, 60.22504, 60.22504, 60.22505, 60.22508, + 60.22512, 60.22513, 60.22517, 60.22523, 60.22529, 60.22532, 60.22535, 60.22535, 60.22536, + 60.22536, 60.22538, 60.2254, 60.22543, 60.22545, 60.22548, 60.22551, 60.22551, 60.22548, + 60.22547, 60.22547, 60.22546, 60.22546, 60.22544, 60.22543, 60.22542, 60.22541, 60.22539, + 60.22538, 60.22536, 60.22535, 60.22528, 60.22521, 60.22513, 60.22509, 60.22506, 60.22504, + 60.22502, 60.22499, 60.22496, 60.22494, 60.22491, 60.22489, 60.22487, 60.22484, 60.22481, + 60.22479, 60.22476, 60.22473, 60.22471, 60.22468, 60.22466, 60.22463, 60.22461, 60.22458, + 60.22456, 60.22453, 60.2245, 60.22448, 60.22445, 60.22443, 60.2244, 60.22438, 60.22435, + 60.22433, 60.2243, 60.22428, 60.22425, 60.22423, 60.2242, 60.22418, 60.22416, 60.22414, + 60.22412, 60.22409, 60.22407, 60.22405, 60.22402, 60.22401, 60.22398, 60.22396, 60.22392, + 60.2239, 60.22387, 60.22386, 60.22383, 60.22382, 60.22384, 60.22385, 60.22382, 60.22383, + 60.22383, 60.22383, 60.22383, 60.22382, 60.2238, 60.2238, 60.22379, 60.22379, 60.2238, + 60.2238, 60.2238, 60.22381, 60.22382, 60.22383, 60.22384, 60.22384, 60.22385, 60.22385, + 60.22387, 60.22388, 60.2239, 60.22392, 60.22393, 60.22395, 60.22396, 60.22397, 60.22399, + 60.22408, 60.22418, 60.22425, 60.22428, 60.22431, 60.22435, 60.22436, 60.22437, 60.22438, + 60.22439, 60.2244, 60.22442, 60.22446, 60.22451, 60.22455, 60.22446, 60.22444, 60.22442, + 60.22439, 60.22437, 60.22433, 60.22431, 60.22428, 60.22426, 60.22423, 60.22421, 60.22418, + 60.22416, 60.22414, 60.22412, 60.22409, 60.22407, 60.22406, 60.22404, 60.22402, 60.22401, + 60.22399, 60.22397, 60.22396, 60.22394, 60.22392, 60.22389, 60.22387, 60.22386, 60.22384, + 60.22382, 60.2238, 60.22378, 60.22376, 60.22367, 60.22358, 60.2235, 60.22343, 60.22337, + 60.2233, 60.22323, 60.22315, 60.22306, 60.22302, 60.22299, 60.22298, 60.22296, 60.22294, + 60.22293, 60.22291, 60.22283, 60.22274, 60.22266, 60.22259, 60.22253, 60.22245, 60.22236, + 60.22227, 60.22216, 60.22209, 60.22207, 60.22205, 60.222, 60.22198, 60.22196, 60.22194, + 60.22192, 60.2219, 60.22188, 60.22185, 60.22182, 60.2218, 60.22177, 60.22175, 60.22173, + 60.2217, 60.22168, 60.22166, 60.22164, 60.22162, 60.22159, 60.22157, 60.22155, 60.22152, + 60.2215, 60.22148, 60.22145, 60.22143, 60.22141, 60.22139, 60.22136, 60.22134, 60.22131, + 60.22129, 60.22126, 60.22124, 60.22122, 60.2212, 60.22119, 60.22114, 60.2211, 60.22105, + 60.221, 60.22097, 60.22093, 60.22091, 60.22091, 60.22091, 60.2209, 60.22086, 60.22083, + 60.22079, 60.2207, 60.22067, 60.22066, 60.22065, 60.22064, 60.22063, 60.22062, 60.2206, + 60.22058, 60.22057, 60.22056, 60.22055, 60.22054, 60.22053, 60.22052, 60.22052, 60.22051, + 60.2205, 60.2205, 60.22049, 60.22048, 60.22048, 60.22047, 60.22046, 60.22045, 60.22044, + 60.22043, 60.22042, 60.22041, 60.2204, 60.2204, 60.22039, 60.22038, 60.22037, 60.22036, + 60.22036, 60.22034, 60.22033, 60.22033, 60.22032, 60.22032, 60.22031, 60.2203, 60.2203, + 60.22029, 60.22029, 60.22029, 60.22029, 60.22029, 60.22029, 60.22029, 60.22028, 60.22027, + 60.22023, 60.22022, 60.2202, 60.22018, 60.22016, 60.22014, 60.22012, 60.2201, 60.22007, + 60.22005, 60.22002, 60.21999, 60.21997, 60.21994, 60.21992, 60.2199, 60.21987, 60.21985, + 60.21983, 60.21981, 60.21979, 60.21977, 60.21974, 60.21971, 60.21969, 60.21967, 60.21964, + 60.21961, 60.21957, 60.21954, 60.21952, 60.21949, 60.21946, 60.21943, 60.2194, 60.21937, + 60.21934, 60.21931, 60.21929, 60.21926, 60.21924, 60.21921, 60.21919, 60.21916, 60.21914, + 60.21912, 60.2191, 60.21907, 60.21905, 60.21902, 60.219, 60.21898, 60.21895, 60.21892, + 60.2189, 60.21887, 60.21885, 60.21882, 60.2188, 60.21877, 60.21874, 60.21872, 60.21869, + 60.21867, 60.21865, 60.21862, 60.2186, 60.21857, 60.21854, 60.21851, 60.21848, 60.21845, + 60.21842, 60.21839, 60.21837, 60.21834, 60.21832, 60.21831, 60.21828, 60.21826, 60.21823, + 60.21821, 60.21819, 60.2181, 60.21808, 60.21806, 60.21802, 60.21799, 60.21797, 60.21794, + 60.21792, 60.21789, 60.21787, 60.21784, 60.21781, 60.21778, 60.21776, 60.21773, 60.21771, + 60.21769, 60.21766, 60.21764, 60.21762, 60.2176, 60.21757, 60.21755, 60.21753, 60.21751, + 60.21749, 60.21747, 60.21745, 60.21741, 60.21738, 60.21736, 60.21733, 60.2173, 60.21728, + 60.21726, 60.21724, 60.21721, 60.21719, 60.21717, 60.21714, 60.21712, 60.21709, 60.21707, + 60.21704, 60.21702, 60.21699, 60.21697, 60.21695, 60.21693, 60.2169, 60.21689, 60.21686, + 60.21684, 60.21673, 60.21663, 60.21661, 60.21658, 60.21656, 60.21654, 60.2165, 60.21644, + 60.21643, 60.21639, 60.21637, 60.21634, 60.21632, 60.2163, 60.21628, 60.21626, 60.21624, + 60.21621, 60.21619, 60.21616, 60.21614, 60.21611, 60.21609, 60.21607, 60.21603, 60.216, + 60.21598, 60.21596, 60.21593, 60.2159, 60.21586, 60.21583, 60.2158, 60.21577, 60.21575, + 60.21572, 60.2157, 60.21567, 60.21563, 60.21561, 60.21558, 60.21556, 60.21553, 60.21546, + 60.21544, 60.21541, 60.21539, 60.21536, 60.21534, 60.21532, 60.2153, 60.21529, 60.21528, + 60.21527, 60.21525, 60.21524, 60.21523, 60.21522, 60.21521, 60.2152, 60.2152, 60.21519, + 60.21519, 60.21518, 60.21518, 60.21518, 60.21518, 60.21518, 60.21517, 60.21516, 60.21516, + 60.21515, 60.21514, 60.21514, 60.21514, 60.21513, 60.21513, 60.21513, 60.21512, 60.21513, + 60.21513, 60.21513, 60.21514, 60.21514, 60.21515, 60.21516, 60.21516, 60.21518, 60.21519, + 60.21524, 60.2153, 60.21537, 60.21541, 60.21543, 60.21547, 60.21547, 60.21548, 60.21549, + 60.2155, 60.21551, 60.21552, 60.21553, 60.21553, 60.21553, 60.21552, 60.21552, 60.21551, + 60.2155, 60.21549, 60.21549, 60.21548, 60.21547, 60.21546, 60.21544, 60.21543, 60.21541, + 60.21539, 60.21538, 60.21536, 60.21534, 60.21532, 60.2153, 60.21528, 60.21525, 60.21523, + 60.21521, 60.21519, 60.21517, 60.21515, 60.21512, 60.2151, 60.21507, 60.21505, 60.21503, + 60.21501, 60.21499, 60.21497, 60.21495, 60.21493, 60.21491, 60.2149, 60.21488, 60.21486, + 60.21485, 60.21483, 60.21482, 60.21481, 60.21479, 60.21478, 60.21477, 60.21475, 60.21475, + 60.21474, 60.21473, 60.21472, 60.21471, 60.2147, 60.2147, 60.2147, 60.21469, 60.21469, + 60.21469, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, + 60.21467, 60.21467, 60.21467, 60.21467, 60.21466, 60.21466, 60.21466, 60.21465, 60.21464, + 60.21464, 60.21463, 60.21463, 60.21462, 60.21462, 60.21461, 60.21461, 60.21461, 60.21461, + 60.21461, 60.21461, 60.2146, 60.21459, 60.21458, 60.21458, 60.21457, 60.21457, 60.21456, + 60.21456, 60.21456, 60.21455, 60.21455, 60.21454, 60.21454, 60.21453, 60.21453, 60.21452, + 60.21452, 60.21451, 60.2145, 60.2145, 60.2145, 60.21449, 60.21449, 60.2145, 60.2145, + 60.2145, 60.2145, 60.2145, 60.21451, 60.21452, 60.21452, 60.21452, 60.21452, 60.21453, + 60.21453, 60.21453, 60.21453, 60.21453, 60.21453, 60.21452, 60.21452, 60.21452, 60.21451, + 60.2145, 60.2145, 60.21449, 60.21447, 60.21446, 60.21444, 60.21443, 60.21442, 60.2144, + 60.2144, 60.21438, 60.21437, 60.21437, 60.21436, 60.21436, 60.21435, 60.21435, 60.21435, + 60.21434, 60.21433, 60.21433, 60.21432, 60.21431, 60.2143, 60.2143, 60.21429, 60.21429, + 60.21428, 60.21426, 60.21425, 60.21424, 60.21423, 60.21422, 60.2142, 60.21419, 60.21418, + 60.21416, 60.21415, 60.21414, 60.21412, 60.21411, 60.2141, 60.21408, 60.21407, 60.21405, + 60.21404, 60.21403, 60.21401, 60.214, 60.21398, 60.21397, 60.21395, 60.21393, 60.21391, + 60.21389, 60.21388, 60.21386, 60.21385, 60.21383, 60.21382, 60.21381, 60.21379, 60.21378, + 60.21376, 60.21375, 60.21374, 60.21372, 60.2137, 60.21368, 60.21367, 60.21365, 60.21364, + 60.21362, 60.21361, 60.2136, 60.21358, 60.21357, 60.21356, 60.21355, 60.21354, 60.21353, + 60.21352, 60.21351, 60.2135, 60.21348, 60.21347, 60.21345, 60.21344, 60.21342, 60.21341, + 60.2134, 60.21339, 60.21338, 60.21337, 60.21336, 60.21336, 60.21335, 60.21334, 60.21334, + 60.21333, 60.21333, 60.21333, 60.21333, 60.21333, 60.21333, 60.21332, 60.2133, 60.21329, + 60.21328, 60.21326, 60.21325, 60.21321, 60.21319, 60.21316, 60.21314, 60.21311, 60.21308, + 60.21304, 60.21301, 60.21298, 60.21294, 60.21291, 60.21288, 60.21285, 60.21282, 60.21279, + 60.21276, 60.21274, 60.21271, 60.21268, 60.21266, 60.21263, 60.2126, 60.21258, 60.21255, + 60.21252, 60.2125, 60.21247, 60.21244, 60.21241, 60.21238, 60.21235, 60.21233, 60.2123, + 60.21228, 60.21225, 60.21222, 60.21219, 60.21217, 60.21214, 60.21212, 60.2121, 60.21208, + 60.21206, 60.21204, 60.21202, 60.212, 60.21199, 60.21198, 60.21196, 60.21196, 60.21196, + 60.21196, 60.21195, 60.21195, 60.21196, 60.21195, 60.21196, 60.21196, 60.21196, 60.21196, + 60.21196, 60.21195, 60.21194, 60.21193, 60.21191, 60.2119, 60.21188, 60.21186, 60.21185, + 60.21182, 60.2118, 60.21178, 60.21175, 60.21173, 60.21171, 60.21169, 60.21167, 60.21166, + 60.21164, 60.21163, 60.21161, 60.21159, 60.21158, 60.21157, 60.21155, 60.21154, 60.21153, + 60.21152, 60.21151, 60.2115, 60.21149, 60.21148, 60.21146, 60.21145, 60.21144, 60.21143, + 60.21142, 60.21141, 60.21139, 60.21138, 60.21138, 60.21138, 60.21138, 60.21139, 60.21141, + 60.21143, 60.21146, 60.21149, 60.21152, 60.21154, 60.21157, 60.21159, 60.21162, 60.21164, + 60.21167, 60.21169, 60.21172, 60.21174, 60.21177, 60.21179, 60.21181, 60.21184, 60.21186, + 60.21189, 60.21191, 60.21194, 60.21196, 60.21199, 60.21201, 60.21204, 60.21206, 60.21208, + 60.21211, 60.21213, 60.21215, 60.21217, 60.2122, 60.21222, 60.21224, 60.21227, 60.21229, + 60.21231, 60.21234, 60.21236, 60.21238, 60.2124, 60.21243, 60.21245, 60.21247, 60.21249, + 60.21252, 60.21254, 60.21257, 60.21259, 60.21261, 60.21263, 60.21266, 60.21268, 60.21271, + 60.21273, 60.21276, 60.21278, 60.2128, 60.21283, 60.21285, 60.21288, 60.2129, 60.21293, + 60.21295, 60.21297, 60.213, 60.21302, 60.21304, 60.21307, 60.2131, 60.21312, 60.21315, + 60.21317, 60.2132, 60.21322, 60.21325, 60.21327, 60.2133, 60.21332, 60.21335, 60.21337, + 60.2134, 60.21342, 60.21345, 60.21347, 60.21349, 60.21351, 60.21354, 60.21356, 60.21358, + 60.2136, 60.21363, 60.21365, 60.21367, 60.21369, 60.21372, 60.21374, 60.21377, 60.21379, + 60.21382, 60.21384, 60.21386, 60.21389, 60.21391, 60.21394, 60.21396, 60.21399, 60.21401, + 60.21404, 60.21406, 60.21409, 60.21412, 60.21414, 60.21416, 60.21419, 60.21421, 60.21424, + 60.21426, 60.21429, 60.21431, 60.21433, 60.21436, 60.21438, 60.21441, 60.21443, 60.21445, + 60.21448, 60.2145, 60.21453, 60.21456, 60.21458, 60.2146, 60.21463, 60.21465, 60.21467, + 60.2147, 60.21472, 60.21474, 60.21477, 60.21479, 60.21481, 60.21484, 60.21486, 60.21489, + 60.21491, 60.21494, 60.21496, 60.21499, 60.21501, 60.21504, 60.21506, 60.21509, 60.21511, + 60.21513, 60.21516, 60.21518, 60.21521, 60.21523, 60.21526, 60.21528, 60.21531, 60.21533, + 60.21536, 60.21538, 60.21541, 60.21543, 60.21546, 60.21548, 60.21551, 60.21554, 60.21556, + 60.21558, 60.21561, 60.21564, 60.21566, 60.21569, 60.21571, 60.21573, 60.21576, 60.21578, + 60.21581, 60.21583, 60.21585, 60.21588, 60.2159, 60.21592, 60.21595, 60.21597, 60.216, + 60.21602, 60.21604, 60.21606, 60.21609, 60.21611, 60.21613, 60.21616, 60.21618, 60.2162, + 60.21623, 60.21625, 60.21627, 60.2163, 60.21632, 60.21634, 60.21637, 60.21639, 60.21642, + 60.21644, 60.21646, 60.21649, 60.21651, 60.21653, 60.21654, 60.21654, 60.21655, 60.21656, + 60.21658, 60.2166, 60.21662, 60.21664, 60.21666, 60.21668, 60.21671, 60.21673, 60.21675, + 60.21677, 60.21679, 60.21681, 60.21683, 60.21684, 60.21686, 60.21687, 60.21689, 60.21691, + 60.21692, 60.21693, 60.21695, 60.21696, 60.21698, 60.217, 60.21702, 60.21704, 60.21706, + 60.21708, 60.2171, 60.21711, 60.21713, 60.21716, 60.21719, 60.21721, 60.21722, 60.21724, + 60.21727, 60.21729, 60.21731, 60.21733, 60.21735, 60.21737, 60.21739, 60.2174, 60.21742, + 60.21744, 60.21745, 60.21747, 60.21748, 60.21749, 60.2175, 60.21752, 60.21752, 60.21754, + 60.21755, 60.21757, 60.21762, 60.2177, 60.21778, 60.21786, 60.21794, 60.21796, 60.21801, + 60.21806, 60.21809, 60.21812, 60.21813, 60.21814, 60.21815, 60.21815, 60.21816, 60.21816, + 60.21816, 60.21816, 60.21816, 60.21817, 60.21818, 60.21819, 60.2182, 60.2182, 60.21827, + 60.21836, 60.21844, 60.21852, 60.21858, 60.21865, 60.2187, 60.21873, 60.21875, 60.21877, + 60.21877, 60.21878, 60.21879, 60.2188, 60.21882, 60.21883, 60.21883, 60.21884, 60.21884, + 60.21884, 60.21884, 60.21885, 60.21884, 60.21884, 60.21884, 60.21883, 60.21882, 60.21881, + 60.2188, 60.21879, 60.21878, 60.21878, 60.21878, 60.21878, 60.21878, 60.21878, 60.21879, + 60.21879, 60.2188, 60.21881, 60.21882, 60.21883, 60.21883, 60.21884, 60.21884, 60.21885, + 60.21885, 60.21886, 60.21887, 60.21888, 60.21888, 60.21889, 60.21889, 60.21889, 60.21888, + 60.21889, 60.21889, 60.2189, 60.21891, 60.21892, 60.21894, 60.21896, 60.21898, 60.219, + 60.21902, 60.21904, 60.21906, 60.21908, 60.2191, 60.21912, 60.21914, 60.21916, 60.21918, + 60.2192, 60.21922, 60.21924, 60.21926, 60.21928, 60.2193, 60.21932, 60.21934, 60.21936, + 60.21938, 60.2194, 60.21942, 60.21944, 60.21951, 60.21953, 60.21956, 60.21957, 60.21958, + 60.2196, 60.21963, 60.21971, 60.21976, 60.21977, 60.21979, 60.2198, 60.21983, 60.21984, + 60.21986, 60.21988, 60.2199, 60.21992, 60.21994, 60.21996, 60.21998, 60.21999, 60.22008, + 60.22015, 60.22017, 60.2202, 60.22021, 60.22022, 60.22029, 60.22033, 60.22037, 60.22039, + 60.22041, 60.22043, 60.22045, 60.22047, 60.22049, 60.22051, 60.22053, 60.22056, 60.22058, + 60.2206, 60.22062, 60.22064, 60.22066, 60.22067, 60.22069, 60.22071, 60.22073, 60.22075, + 60.22078, 60.22079, 60.22081, 60.22083, 60.22085, 60.22087, 60.22089, 60.22092, 60.22094, + 60.22096, 60.22098, 60.221, 60.22103, 60.22105, 60.22106, 60.22107, 60.22109, 60.2211, + 60.22112, 60.22113, 60.22114, 60.22115, 60.22117, 60.22118, 60.22119, 60.2212, 60.22122, + 60.22124, 60.22124, 60.22124, 60.22123, 60.22122, 60.22121, 60.2212, 60.2212, 60.2212, + 60.2212, 60.2212, 60.22121, 60.22125, 60.22127, 60.22129, 60.2213, 60.22132, 60.22134, + 60.22136, 60.22138, 60.2214, 60.22142, 60.22144, 60.22146, 60.22148, 60.2215, 60.22153, + 60.22155, 60.22158, 60.2216, 60.22162, 60.22164, 60.22166, 60.22168, 60.2217, 60.22172, + 60.22174, 60.22176, 60.22179, 60.22182, 60.22184, 60.22188, 60.22192, 60.22194, 60.22197, + 60.222, 60.22202, 60.22205, 60.22207, 60.2221, 60.22211, 60.22213, 60.22215, 60.22217, + 60.22219, 60.22222, 60.22224, 60.22227, 60.22229, 60.22232, 60.22234, 60.22236, 60.22237, + 60.22238, 60.22239, 60.22241, 60.22243, 60.22245, 60.22248, 60.2225, 60.22252, 60.22254, + 60.22255, 60.22258, 60.22259, 60.22264, 60.22271, 60.22274, 60.22276, 60.22278, 60.22281, + 60.22283, 60.22287, 60.22289, 60.22292, 60.22294, 60.22297, 60.223, 60.22303, 60.22306, + 60.22309, 60.22312, 60.22316, 60.22318, 60.22321, 60.22324, 60.22328, 60.2233, 60.22332, + 60.22335, 60.22337, 60.22338, 60.2234, 60.22342, 60.22345, 60.22347, 60.22349, 60.22351, + 60.22352, 60.22354, 60.22355, 60.22357, 60.22358, 60.2236, 60.22362, 60.22363, 60.22365, + 60.22368, 60.2237, 60.22371, 60.22373, 60.22375, 60.22377, 60.22378, 60.2238, 60.22381, + 60.22384, 60.22385, 60.22387, 60.22389, 60.22398, 60.22404, 60.22409, 60.2241, 60.22412, + 60.22414, 60.22416, 60.22417, 60.22418, 60.22419, 60.22421, 60.22422, 60.22424, 60.22425, + 60.22427, 60.22429, 60.22431, 60.22434, 60.22436, 60.22439, 60.22441, 60.22443, 60.22445, + 60.22447, 60.22449, 60.22457, 60.22465, 60.22471, 60.22472, 60.22474, 60.22475, 60.22477, + 60.22478, 60.2248, 60.22486, 60.22489, 60.22491, 60.22493, 60.22495, 60.22497, 60.225, + 60.22502, 60.22504, 60.22506, 60.22513, 60.22516, 60.22517, 60.22519, 60.22522, 60.22525, + 60.22527, 60.22529, 60.22531, 60.22533, 60.22535, 60.22537, 60.22539, 60.22542, 60.22544, + 60.22546, 60.22549, 60.22551, 60.22552, 60.22554, 60.22557, 60.22559, 60.22561, 60.22563, + 60.22565, 60.22567, 60.22569, 60.22571, 60.22572, 60.22574, 60.22575, 60.22577, 60.22579, + 60.2258, 60.22582, 60.22584, 60.22586, 60.22588, 60.2259, 60.22591, 60.22593, 60.22595, + 60.22596, 60.22598, 60.226, 60.22602, 60.22605, 60.22607, 60.22609, 60.22611, 60.22612, + 60.22614, 60.22615, 60.22617, 60.22619, 60.2262, 60.22623, 60.22625, 60.22629, 60.22632, + 60.22634, 60.22636, 60.22641, 60.22643, 60.22646, 60.22648, 60.22654, 60.22655, 60.22657, + 60.22658, 60.2266, 60.22662, 60.22664, 60.22666, 60.22668, 60.22671, 60.22673, 60.22676, + 60.22678, 60.22681, 60.22684, 60.22687, 60.22689, 60.22691, 60.22693, 60.22695, 60.22698, + 60.227, 60.22703, 60.22705, 60.22707, 60.22709, 60.22711, 60.22713, 60.22715, 60.22717, + 60.22719, 60.22727, 60.22729, 60.22732, 60.22734, 60.22735, 60.22738, 60.22741, 60.22743, + 60.22744, 60.22747, 60.22751, 60.22753, 60.22755, 60.22757, 60.22759, 60.22761, 60.22763, + 60.22765, 60.22767, 60.22769, 60.22771, 60.22773, 60.22775, 60.22779, 60.22782, 60.22784, + 60.22786, 60.22789, 60.22791, 60.22793, 60.22796, 60.22798, 60.228, 60.22803, 60.22806, + 60.22808, 60.2281, 60.22813, 60.22815, 60.22817, 60.22821, 60.22824, 60.22826, 60.22829, + 60.22832, 60.22835, 60.22838, 60.2284, 60.22842, 60.22844, 60.22846, 60.22848, 60.22849, + 60.2285, 60.2285, 60.2285, 60.2285, 60.22849, 60.22849, 60.22849, 60.22848, 60.22847, + 60.22846, 60.22845, 60.22844, 60.22843, 60.22842, 60.22841, 60.2284, 60.22839, 60.22838, + 60.22837, 60.22836, 60.22835, 60.22834, 60.22833, 60.22832, 60.22831, 60.2283, 60.22829, + 60.22828, 60.22827, 60.22826, 60.22826, 60.22825, 60.22825, 60.22824, 60.22824, 60.22823, + 60.22823, 60.22823, 60.22823, 60.22823, 60.22824, 60.22824, 60.22824, 60.22825, 60.22826, + 60.22826, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, + 60.22827, 60.22827, 60.22826, 60.22826, 60.22826, 60.22826, 60.22827, 60.22827, 60.22827, + 60.22827, 60.22828, 60.22828, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, + 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, + 60.22829, 60.22828, 60.22828, 60.22827, 60.22827, 60.22826, 60.22826, 60.22824, 60.22823, + 60.22822, 60.2282, 60.22818, 60.22817, 60.22816, 60.22814, 60.22813, 60.22811, 60.2281, + 60.22808, 60.22807, 60.22805, 60.22804, 60.22803, 60.22802, 60.22801, 60.22799, 60.22798, + 60.22797, 60.22796, 60.22794, 60.22793, 60.22792, 60.2279, 60.22789, 60.22787, 60.22786, + 60.22785, 60.22784, 60.22782, 60.22781, 60.2278, 60.22779, 60.22777, 60.22776, 60.22774, + 60.22773, 60.22771, 60.22769, 60.22767, 60.22765, 60.22763, 60.22761, 60.22759, 60.22757, + 60.22755, 60.22753, 60.22751, 60.22749, 60.22748, 60.22747, 60.22747, 60.22748, 60.22749, + 60.2275, 60.22752, 60.22754, 60.22756, 60.22757, 60.22759, 60.2276, 60.22762, 60.22763, + 60.22764, 60.22766, 60.22767, 60.22767, 60.22768, 60.22768, 60.22768, 60.22768, 60.22769, + 60.2277, 60.2277, 60.22771, 60.22772, 60.22772, 60.22774, 60.22775, 60.22776, 60.22777, + 60.22778, 60.2278, 60.22781, 60.22782, 60.22784, 60.22784, 60.22785, 60.22786, 60.22787, + 60.22788, 60.2279, 60.22792, 60.22793, 60.22795, 60.22797, 60.22799, 60.228, 60.22802, + 60.22803, 60.22804, 60.22804, 60.22803, 60.22801, 60.22798, 60.22796, 60.22793, 60.22791, + 60.22789, 60.22788, 60.22787, 60.22786, 60.22786, 60.22785, 60.22785, 60.22784, 60.22784, + 60.22784, 60.22783, 60.22783, 60.22782, 60.22781, 60.22781, 60.22781, 60.22782, 60.22782, + 60.22782, 60.22782, 60.22782, 60.22782, 60.22781, 60.22781, 60.22781, 60.22781, 60.22782, + 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, + 60.22781, 60.22781, 60.22781, 60.22781, 60.2278, 60.2278, 60.2278, 60.2278, 60.2278, + 60.22779, 60.22779, 60.22779, 60.22778, 60.22777, 60.22776, 60.22776, 60.22775, 60.22775, + 60.22775, 60.22775, 60.22775, 60.22775, 60.22775, 60.22776, 60.22775, 60.22775, 60.22774, + 60.22774, 60.22773, 60.22773, 60.22772, 60.22772, 60.22772, 60.22771, 60.22771, 60.22771, + 60.2277, 60.22769, 60.22767, 60.22765, 60.22763, 60.2276, 60.22759, 60.22757, 60.22756, + 60.22754, 60.22752, 60.2275, 60.22748, 60.22746, 60.22745, 60.22743, 60.22742, 60.2274, + 60.22738, 60.22737, 60.22734, 60.22732, 60.2273, 60.22728, 60.22726, 60.22725, 60.22723, + 60.22721, 60.2272, 60.22718, 60.22717, 60.22715, 60.22713, 60.22711, 60.22709, 60.22706, + 60.22704, 60.22702, 60.22699, 60.22696, 60.22693, 60.22691, 60.22688, 60.22686, 60.22683, + 60.22679, 60.22676, 60.22673, 60.2267, 60.22666, 60.22662, 60.22659, 60.22655, 60.22652, + 60.22649, 60.22645, 60.22642, 60.22638, 60.22635, 60.22632, 60.22629, 60.22626, 60.22622, + 60.22619, 60.22615, 60.22612, 60.22608, 60.22605, 60.22601, 60.22598, 60.22595, 60.22592, + 60.22588, 60.22585, 60.22582, 60.22579, 60.22575, 60.22571, 60.22567, 60.22564, 60.2256, + 60.22556, 60.22552, 60.22548, 60.22545, 60.22541, 60.22537, 60.22534, 60.2253, 60.22526, + 60.22522, 60.22518, 60.22514, 60.2251, 60.22506, 60.22503, 60.22499, 60.22496, 60.22491, + 60.22487) + +internal val longs = listOf(25.07488, 25.07488, 25.07487, 25.07485, 25.07483, 25.07481, 25.07478, + 25.07476, 25.07474, 25.07471, 25.07468, 25.07464, 25.0746, 25.07457, 25.07455, 25.07454, + 25.07452, 25.07451, 25.07448, 25.07447, 25.07445, 25.07443, 25.07436, 25.07429, 25.07419, + 25.07418, 25.07414, 25.07401, 25.07392, 25.07391, 25.07383, 25.07381, 25.0738, 25.07379, + 25.07378, 25.07375, 25.0737, 25.07367, 25.07365, 25.07362, 25.0736, 25.07359, 25.07357, + 25.07355, 25.0735, 25.07346, 25.07335, 25.07322, 25.07315, 25.07312, 25.07301, 25.07298, + 25.07296, 25.07289, 25.07285, 25.07269, 25.07253, 25.07243, 25.07237, 25.07232, 25.07228, + 25.07222, 25.07217, 25.07211, 25.07205, 25.07199, 25.07194, 25.07188, 25.07184, 25.07179, + 25.07175, 25.0717, 25.07164, 25.07159, 25.07155, 25.07151, 25.07142, 25.07138, 25.07132, + 25.07122, 25.07117, 25.07113, 25.0711, 25.07106, 25.07087, 25.07072, 25.07067, 25.07062, + 25.07058, 25.07053, 25.07049, 25.07046, 25.07042, 25.07037, 25.07032, 25.07014, 25.06999, + 25.06994, 25.06974, 25.06954, 25.06935, 25.06915, 25.06897, 25.06889, 25.06881, 25.06861, + 25.06851, 25.06847, 25.06842, 25.06837, 25.06833, 25.06814, 25.06791, 25.06786, 25.06765, + 25.06759, 25.06754, 25.06748, 25.06743, 25.06738, 25.06733, 25.06728, 25.06706, 25.06684, + 25.06673, 25.06669, 25.06664, 25.0666, 25.06655, 25.06637, 25.06618, 25.06595, 25.06575, + 25.06561, 25.06557, 25.06552, 25.06545, 25.06541, 25.06535, 25.06529, 25.06523, 25.06515, + 25.06509, 25.06505, 25.06502, 25.06498, 25.06494, 25.06486, 25.06481, 25.06469, 25.06466, + 25.06462, 25.06457, 25.06453, 25.06447, 25.06429, 25.06409, 25.06386, 25.06371, 25.06367, + 25.06362, 25.06357, 25.06352, 25.06348, 25.06344, 25.06337, 25.06333, 25.06328, 25.06323, + 25.06318, 25.06314, 25.06309, 25.06304, 25.06298, 25.06293, 25.06288, 25.06283, 25.0628, + 25.06275, 25.0627, 25.06264, 25.06259, 25.06254, 25.06248, 25.06243, 25.06239, 25.06234, + 25.06229, 25.06224, 25.06219, 25.06215, 25.06209, 25.06205, 25.062, 25.06195, 25.0619, + 25.06186, 25.06183, 25.0618, 25.06177, 25.06173, 25.06169, 25.06165, 25.0616, 25.06157, + 25.06152, 25.06148, 25.06143, 25.06138, 25.06134, 25.0613, 25.06126, 25.06122, 25.06118, + 25.06113, 25.06109, 25.06104, 25.06099, 25.06095, 25.0609, 25.06086, 25.06082, 25.06078, + 25.06074, 25.06069, 25.06064, 25.0606, 25.06056, 25.06052, 25.06047, 25.06042, 25.06036, + 25.06031, 25.06026, 25.06021, 25.06015, 25.06011, 25.06006, 25.06001, 25.05995, 25.0599, + 25.05985, 25.0598, 25.05975, 25.0597, 25.05965, 25.0596, 25.05955, 25.0595, 25.05946, + 25.05941, 25.05937, 25.05932, 25.05928, 25.05923, 25.05919, 25.05914, 25.0591, 25.05905, + 25.059, 25.05895, 25.0589, 25.05886, 25.05881, 25.05876, 25.05871, 25.05866, 25.05861, + 25.05856, 25.0585, 25.05846, 25.05841, 25.05837, 25.05832, 25.05827, 25.05823, 25.05819, + 25.05815, 25.0581, 25.05805, 25.05801, 25.05797, 25.05792, 25.05787, 25.05782, 25.05776, + 25.05771, 25.05766, 25.0576, 25.05754, 25.05748, 25.05742, 25.05736, 25.0573, 25.05724, + 25.05707, 25.05703, 25.05698, 25.05693, 25.05689, 25.05684, 25.0568, 25.05676, 25.05672, + 25.05668, 25.05663, 25.05659, 25.05654, 25.05649, 25.05644, 25.05638, 25.05633, 25.05619, + 25.05616, 25.05613, 25.0561, 25.05608, 25.05607, 25.05606, 25.05605, 25.05603, 25.05602, + 25.056, 25.05598, 25.05594, 25.05591, 25.05593, 25.05593, 25.05594, 25.05595, 25.05595, + 25.05596, 25.05597, 25.05598, 25.05599, 25.05599, 25.05598, 25.05599, 25.05598, 25.05597, + 25.05597, 25.05595, 25.05595, 25.05593, 25.05592, 25.0559, 25.05589, 25.05588, 25.05576, + 25.05565, 25.05554, 25.05547, 25.05541, 25.05532, 25.05521, 25.0551, 25.05507, 25.05499, + 25.05494, 25.05488, 25.0548, 25.05473, 25.0547, 25.05467, 25.05454, 25.05441, 25.0543, + 25.05418, 25.05407, 25.05404, 25.05397, 25.05392, 25.05388, 25.05383, 25.0538, 25.05375, + 25.05372, 25.0537, 25.05367, 25.05364, 25.0536, 25.05354, 25.05348, 25.05329, 25.05309, + 25.05298, 25.05292, 25.05289, 25.05286, 25.05283, 25.05279, 25.05275, 25.05272, 25.05268, + 25.05265, 25.05261, 25.05258, 25.05255, 25.0525, 25.05244, 25.05241, 25.05237, 25.05233, + 25.0523, 25.05226, 25.05223, 25.0522, 25.05215, 25.05211, 25.05206, 25.05203, 25.052, + 25.05197, 25.05193, 25.05189, 25.05188, 25.05187, 25.05186, 25.05186, 25.05184, 25.05183, + 25.05181, 25.05178, 25.05176, 25.05173, 25.0517, 25.05166, 25.05164, 25.05161, 25.05156, + 25.05153, 25.0515, 25.05148, 25.05146, 25.05143, 25.05141, 25.05136, 25.05133, 25.05131, + 25.05128, 25.05127, 25.05129, 25.05129, 25.05129, 25.05128, 25.05128, 25.05129, 25.0513, + 25.05132, 25.05134, 25.05137, 25.05137, 25.05137, 25.05137, 25.05137, 25.05137, 25.05136, + 25.05136, 25.05135, 25.05133, 25.05131, 25.05129, 25.05128, 25.05126, 25.05124, 25.05121, + 25.05119, 25.05117, 25.05115, 25.05113, 25.05111, 25.05108, 25.05106, 25.05104, 25.05101, + 25.05099, 25.05095, 25.05091, 25.05087, 25.05083, 25.05079, 25.05076, 25.05074, 25.05072, + 25.05072, 25.05071, 25.05069, 25.05069, 25.05067, 25.05065, 25.05063, 25.0506, 25.05058, + 25.05055, 25.05053, 25.05051, 25.05049, 25.05048, 25.05046, 25.05045, 25.05044, 25.05041, + 25.0504, 25.05039, 25.05038, 25.05037, 25.05037, 25.05037, 25.05038, 25.05039, 25.05048, + 25.05049, 25.05049, 25.05049, 25.05048, 25.05045, 25.05045, 25.05045, 25.05045, 25.05046, + 25.05047, 25.05049, 25.05051, 25.05055, 25.0506, 25.05066, 25.05071, 25.05076, 25.05079, + 25.05082, 25.05084, 25.05087, 25.0509, 25.05092, 25.05093, 25.05094, 25.05092, 25.05091, + 25.0509, 25.05081, 25.05064, 25.05059, 25.05054, 25.05049, 25.05044, 25.05039, 25.05034, + 25.05029, 25.05025, 25.0502, 25.05014, 25.04998, 25.04993, 25.04979, 25.0496, 25.04943, + 25.04928, 25.04911, 25.04891, 25.04871, 25.04851, 25.0483, 25.04809, 25.0479, 25.04771, + 25.04751, 25.04732, 25.04712, 25.04693, 25.04676, 25.04658, 25.04638, 25.04631, 25.04614, + 25.04599, 25.04582, 25.04566, 25.04548, 25.04526, 25.04504, 25.04486, 25.04469, 25.0445, + 25.04434, 25.04416, 25.04402, 25.04384, 25.04373, 25.04361, 25.04354, 25.04348, 25.04342, + 25.04336, 25.04331, 25.04327, 25.04322, 25.04316, 25.04298, 25.04281, 25.04265, 25.04243, + 25.04223, 25.04206, 25.04189, 25.04168, 25.04149, 25.04127, 25.04111, 25.04106, 25.04101, + 25.04095, 25.0409, 25.04084, 25.04079, 25.04068, 25.04062, 25.04057, 25.04051, 25.04046, + 25.04041, 25.04035, 25.0403, 25.04025, 25.04019, 25.04013, 25.04007, 25.04001, 25.03995, + 25.03989, 25.03983, 25.03978, 25.03974, 25.0397, 25.03966, 25.0396, 25.03955, 25.03949, + 25.03943, 25.03937, 25.03932, 25.03926, 25.03909, 25.03906, 25.03902, 25.039, 25.03897, + 25.03894, 25.03892, 25.0389, 25.03887, 25.03885, 25.03882, 25.0388, 25.03877, 25.03875, + 25.03872, 25.03869, 25.03867, 25.03864, 25.03861, 25.03859, 25.03856, 25.03855, 25.03852, + 25.03849, 25.03847, 25.03844, 25.03841, 25.03839, 25.03836, 25.03834, 25.03832, 25.03829, + 25.03827, 25.03825, 25.03823, 25.0382, 25.03817, 25.03814, 25.03811, 25.03809, 25.03806, + 25.03804, 25.03801, 25.03799, 25.03797, 25.03794, 25.03792, 25.0379, 25.03788, 25.03785, + 25.03783, 25.0378, 25.03778, 25.03775, 25.03772, 25.0377, 25.03768, 25.03765, 25.03763, + 25.03761, 25.03758, 25.03756, 25.03753, 25.0375, 25.03748, 25.03746, 25.03744, 25.03742, + 25.03739, 25.03736, 25.03733, 25.0373, 25.03727, 25.03724, 25.03722, 25.03719, 25.03717, + 25.03714, 25.03712, 25.0371, 25.03708, 25.03705, 25.03702, 25.037, 25.03698, 25.03695, + 25.03693, 25.0369, 25.03687, 25.03684, 25.03681, 25.03679, 25.03675, 25.03671, 25.03667, + 25.03663, 25.03659, 25.03651, 25.03635, 25.03627, 25.03623, 25.03618, 25.03611, 25.03606, + 25.03602, 25.03595, 25.03591, 25.03586, 25.03581, 25.03576, 25.03573, 25.03569, 25.03565, + 25.03561, 25.03557, 25.03553, 25.03548, 25.03544, 25.03538, 25.03533, 25.03528, 25.03524, + 25.03519, 25.03513, 25.03508, 25.03502, 25.03497, 25.03493, 25.03488, 25.03483, 25.03479, + 25.03474, 25.03469, 25.03464, 25.03459, 25.03454, 25.03448, 25.03443, 25.03438, 25.03433, + 25.03428, 25.03424, 25.03419, 25.03414, 25.0341, 25.03405, 25.034, 25.03396, 25.03392, + 25.03387, 25.03384, 25.0338, 25.03374, 25.03369, 25.03365, 25.0336, 25.03356, 25.03352, + 25.03348, 25.03344, 25.0334, 25.03337, 25.03332, 25.03328, 25.03324, 25.03318, 25.03312, + 25.03306, 25.03301, 25.03295, 25.03289, 25.03284, 25.03279, 25.03274, 25.03269, 25.03263, + 25.03257, 25.03251, 25.03246, 25.0324, 25.03234, 25.03229, 25.03224, 25.03218, 25.03213, + 25.03208, 25.03202, 25.03197, 25.03191, 25.03185, 25.03179, 25.03174, 25.03168, 25.03163, + 25.03157, 25.03152, 25.03147, 25.03142, 25.03137, 25.03132, 25.03127, 25.03122, 25.03117, + 25.03112, 25.03107, 25.03102, 25.0308, 25.03059, 25.03049, 25.03044, 25.03039, 25.03035, + 25.03031, 25.03027, 25.03023, 25.03018, 25.03013, 25.03003, 25.02996, 25.0299, 25.02985, + 25.02978, 25.02973, 25.02968, 25.02947, 25.02942, 25.02937, 25.02932, 25.02927, 25.02905, + 25.02894, 25.02888, 25.02883, 25.0286, 25.02838, 25.02818, 25.02797, 25.02777, 25.02763, + 25.02758, 25.02754, 25.02749, 25.02743, 25.02738, 25.02733, 25.02729, 25.02724, 25.02719, + 25.02714, 25.02709, 25.02704, 25.02699, 25.02693, 25.02687, 25.02682, 25.02676, 25.0267, + 25.02664, 25.02658, 25.02652, 25.02647, 25.02641, 25.02618, 25.02607, 25.02602, 25.02582, + 25.02563, 25.02543, 25.02525, 25.02507, 25.02488, 25.02472, 25.02453, 25.02447, 25.02442, + 25.02437, 25.02429, 25.02419, 25.02411, 25.02407, 25.02399, 25.02382, 25.02362, 25.02347, + 25.02343, 25.02338, 25.02334, 25.02329, 25.02324, 25.02319, 25.02314, 25.02308, 25.02303, + 25.02298, 25.02292, 25.02287, 25.02271, 25.02256, 25.02244, 25.02238, 25.02235, 25.02232, + 25.0223, 25.02228, 25.02226, 25.02224, 25.02221, 25.02219, 25.02216, 25.02213, 25.02211, + 25.02209, 25.02207, 25.02204, 25.02202, 25.02201, 25.02199, 25.02197, 25.02194, 25.02192, + 25.0219, 25.02187, 25.02186, 25.02184, 25.02182, 25.0218, 25.02178, 25.02176, 25.02174, + 25.02172, 25.0217, 25.02168, 25.02166, 25.02164, 25.02161, 25.02158, 25.02156, 25.02154, + 25.02151, 25.02149, 25.02148, 25.02147, 25.02147, 25.02148, 25.02148, 25.02148, 25.02146, + 25.02144, 25.0214, 25.02138, 25.02133, 25.02129, 25.02107, 25.02086, 25.0207, 25.02065, + 25.0206, 25.02056, 25.02051, 25.02044, 25.02037, 25.02031, 25.02011, 25.02004, 25.01999, + 25.01993, 25.01986, 25.01982, 25.01977, 25.01972, 25.01966, 25.01961, 25.01957, 25.01951, + 25.01947, 25.01942, 25.01938, 25.01935, 25.01931, 25.01927, 25.01922, 25.01917, 25.01914, + 25.01901, 25.01887, 25.0187, 25.01851, 25.01829, 25.01809, 25.01804, 25.01799, 25.01794, + 25.01789, 25.01784, 25.01779, 25.01759, 25.01743, 25.01724, 25.01714, 25.01716, 25.01719, + 25.01721, 25.01723, 25.01724, 25.01724, 25.01723, 25.01722, 25.01722, 25.01721, 25.0172, + 25.01719, 25.01718, 25.01717, 25.01714, 25.01713, 25.01711, 25.01707, 25.01704, 25.01701, + 25.01697, 25.01694, 25.01691, 25.01687, 25.01684, 25.01681, 25.01677, 25.01674, 25.01671, + 25.01668, 25.01665, 25.01661, 25.0166, 25.01648, 25.01634, 25.01618, 25.01601, 25.01584, + 25.01568, 25.01553, 25.01539, 25.01525, 25.01519, 25.01516, 25.01513, 25.0151, 25.01507, + 25.01504, 25.01501, 25.01489, 25.01475, 25.01464, 25.01451, 25.01437, 25.01427, 25.01421, + 25.01416, 25.01414, 25.01415, 25.01416, 25.01418, 25.01419, 25.0142, 25.01421, 25.01422, + 25.01424, 25.01426, 25.01429, 25.01431, 25.01433, 25.01435, 25.01436, 25.01439, 25.01441, + 25.01445, 25.01448, 25.01452, 25.01456, 25.0146, 25.01463, 25.01466, 25.01469, 25.01472, + 25.01475, 25.01476, 25.01479, 25.01482, 25.01484, 25.01487, 25.0149, 25.01492, 25.01491, + 25.01491, 25.01488, 25.01483, 25.01478, 25.01471, 25.01465, 25.01447, 25.01428, 25.01411, + 25.01395, 25.01377, 25.01358, 25.01338, 25.01317, 25.01299, 25.01281, 25.01264, 25.01244, + 25.01227, 25.01204, 25.01185, 25.01179, 25.01174, 25.01168, 25.01163, 25.01158, 25.01153, + 25.01148, 25.01143, 25.01138, 25.01133, 25.01128, 25.01123, 25.01118, 25.01112, 25.01108, + 25.01103, 25.01098, 25.01093, 25.01089, 25.01084, 25.0108, 25.01074, 25.0107, 25.01065, + 25.0106, 25.01055, 25.01051, 25.01046, 25.01041, 25.01037, 25.01032, 25.01027, 25.01022, + 25.01017, 25.01012, 25.01007, 25.01002, 25.00997, 25.00992, 25.00988, 25.00983, 25.00979, + 25.00974, 25.0097, 25.00965, 25.0096, 25.00956, 25.00951, 25.00947, 25.00941, 25.00936, + 25.00918, 25.009, 25.00882, 25.00871, 25.00865, 25.00862, 25.00861, 25.00859, 25.00857, + 25.00856, 25.00854, 25.00854, 25.00852, 25.00851, 25.0085, 25.00849, 25.00848, 25.00847, + 25.00845, 25.00844, 25.00842, 25.00841, 25.00839, 25.00837, 25.00836, 25.00835, 25.00833, + 25.00831, 25.0083, 25.00828, 25.00827, 25.00825, 25.00824, 25.00823, 25.00822, 25.00821, + 25.0082, 25.00818, 25.00816, 25.00815, 25.00814, 25.00814, 25.00814, 25.00813, 25.00814, + 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, + 25.00814, 25.00815, 25.00815, 25.00815, 25.00815, 25.00814, 25.00814, 25.00813, 25.00813, + 25.00813, 25.00812, 25.00812, 25.00813, 25.00812, 25.00813, 25.00813, 25.00813, 25.00815, + 25.00816, 25.00816, 25.00817, 25.00818, 25.0082, 25.00822, 25.00826, 25.00829, 25.00832, + 25.00835, 25.00838, 25.00852, 25.00854, 25.00856, 25.00862, 25.00865, 25.00867, 25.0087, + 25.00873, 25.00875, 25.00876, 25.00877, 25.00879, 25.00881, 25.00883, 25.00885, 25.00885, + 25.00887, 25.00889, 25.00889, 25.00891, 25.00893, 25.00895, 25.00897, 25.00899, 25.00902, + 25.00905, 25.00907, 25.0091, 25.00914, 25.00917, 25.00918, 25.0092, 25.00922, 25.00923, + 25.00925, 25.00925, 25.00926, 25.00928, 25.00929, 25.0093, 25.00931, 25.00932, 25.00932, + 25.00932, 25.00933, 25.00933, 25.00933, 25.00934, 25.00935, 25.00936, 25.00937, 25.00938, + 25.00939, 25.0094, 25.00941, 25.00942, 25.00943, 25.00947, 25.00949, 25.00955, 25.00963, + 25.00965, 25.00967, 25.0097, 25.00971, 25.00973, 25.00976, 25.00978, 25.0098, 25.00982, + 25.00983, 25.00984, 25.00985, 25.00984, 25.00984, 25.00984, 25.00983, 25.00981, 25.0098, + 25.00978, 25.00977, 25.00977, 25.00976, 25.00976, 25.00977, 25.00978, 25.00978, 25.0098, + 25.00982, 25.00984, 25.00985, 25.00986, 25.00987, 25.00988, 25.00989, 25.0099, 25.00992, + 25.00994, 25.00996, 25.00998, 25.00999, 25.01001, 25.01004, 25.01008, 25.01012, 25.01016, + 25.01021, 25.01024, 25.01028, 25.01032, 25.01036, 25.0104, 25.01044, 25.01047, 25.01051, + 25.01056, 25.01059, 25.01063, 25.0107, 25.01075, 25.01079, 25.01084, 25.01088, 25.01093, + 25.01097, 25.01102, 25.01106, 25.0111, 25.01115, 25.01119, 25.01123, 25.01131, 25.01135, + 25.01139, 25.01144, 25.01147, 25.01152, 25.01156, 25.01161, 25.01166, 25.01171, 25.01177, + 25.01201, 25.01217, 25.01234, 25.01253, 25.01274, 25.01294, 25.013, 25.01306, 25.01311, + 25.01316, 25.01321, 25.01327, 25.01332, 25.01337, 25.01342, 25.01347, 25.01353, 25.01359, + 25.01365, 25.0137, 25.01375, 25.0138, 25.01385, 25.0139, 25.01395, 25.01398, 25.01402, + 25.01405, 25.01409, 25.01413, 25.01417, 25.0142, 25.01423, 25.01427, 25.0143, 25.01434, + 25.01437, 25.01439, 25.01442, 25.01445, 25.01449, 25.01452, 25.01455, 25.01459, 25.01462, + 25.01465, 25.01469, 25.01473, 25.01477, 25.0148, 25.01485, 25.01488, 25.01491, 25.01495, + 25.015, 25.01503, 25.01508, 25.01513, 25.01518, 25.01524, 25.01529, 25.01536, 25.01542, + 25.01548, 25.01554, 25.0156, 25.01566, 25.01572, 25.01577, 25.01582, 25.01588, 25.01593, + 25.01598, 25.01603, 25.01608, 25.01613, 25.01619, 25.01624, 25.01629, 25.01634, 25.01639, + 25.01645, 25.01651, 25.01656, 25.01662, 25.01668, 25.01674, 25.0168, 25.01686, 25.01691, + 25.01697, 25.01702, 25.01707, 25.01713, 25.01718, 25.01723, 25.01729, 25.01734, 25.01738, + 25.01744, 25.01749, 25.01754, 25.01759, 25.01764, 25.01769, 25.01774, 25.01779, 25.01784, + 25.01789, 25.01793, 25.01798, 25.01803, 25.01809, 25.01814, 25.01819, 25.01823, 25.01828, + 25.01832, 25.01836, 25.01851, 25.01855, 25.01859, 25.01864, 25.01868, 25.01873, 25.01878, + 25.01883, 25.01887, 25.01892, 25.01909, 25.01914, 25.01921, 25.01926, 25.01932, 25.01939, + 25.01944, 25.0195, 25.01956, 25.01962, 25.01968, 25.01973, 25.01979, 25.01984, 25.0199, + 25.01997, 25.02002, 25.02008, 25.02013, 25.02017, 25.02022, 25.02027, 25.02032, 25.02038, + 25.02043, 25.02049, 25.02054, 25.0206, 25.02065, 25.0207, 25.02075, 25.0208, 25.02085, + 25.0209, 25.02095, 25.021, 25.02106, 25.02111, 25.02116, 25.02121, 25.02127, 25.02132, + 25.02137, 25.02142, 25.02147, 25.02152, 25.02157, 25.02162, 25.02168, 25.02173, 25.02178, + 25.02183, 25.02188, 25.02193, 25.02199, 25.02203, 25.02208, 25.02213, 25.02217, 25.02221, + 25.02225, 25.0223, 25.02235, 25.02239, 25.02244, 25.02248, 25.02252, 25.02257, 25.02261, + 25.02265, 25.02269, 25.02272, 25.02276, 25.0228, 25.02284, 25.02288, 25.02291, 25.02294, + 25.02298, 25.02302, 25.02305, 25.02309, 25.02313, 25.02316, 25.02319, 25.02322, 25.02326, + 25.02329, 25.02332, 25.02336, 25.0234, 25.02344, 25.02349, 25.02352, 25.02357, 25.02361, + 25.02366, 25.02371, 25.02375, 25.0238, 25.02384, 25.02387, 25.02391, 25.02394, 25.02399, + 25.02404, 25.02409, 25.02415, 25.02419, 25.02423, 25.02427, 25.02432, 25.02436, 25.02441, + 25.02445, 25.02449, 25.02454, 25.02457, 25.02462, 25.02466, 25.0247, 25.02474, 25.02477, + 25.0248, 25.02483, 25.02485, 25.02491, 25.02493, 25.02498, 25.025, 25.02504, 25.02507, + 25.02509, 25.02512, 25.02515, 25.02518, 25.0252, 25.02522, 25.02524, 25.02526, 25.02527, + 25.02528, 25.02529, 25.02531, 25.02532, 25.02533, 25.02535, 25.02536, 25.02537, 25.02538, + 25.02538, 25.02539, 25.02539, 25.02539, 25.0254, 25.02541, 25.02541, 25.02541, 25.02541, + 25.02542, 25.02542, 25.02542, 25.02542, 25.02544, 25.02545, 25.02547, 25.0255, 25.02552, + 25.02554, 25.02556, 25.02558, 25.0256, 25.02564, 25.02569, 25.02576, 25.0258, 25.02584, + 25.02588, 25.02592, 25.02597, 25.02601, 25.02608, 25.02612, 25.02617, 25.02622, 25.02627, + 25.02632, 25.02636, 25.02642, 25.02646, 25.02651, 25.02656, 25.02661, 25.02666, 25.02671, + 25.02675, 25.02678, 25.02682, 25.02686, 25.02689, 25.02693, 25.02697, 25.02701, 25.02704, + 25.0271, 25.02715, 25.02719, 25.02723, 25.02728, 25.02732, 25.02737, 25.02741, 25.02746, + 25.02751, 25.02757, 25.02762, 25.02767, 25.02772, 25.02776, 25.02781, 25.02786, 25.02791, + 25.02795, 25.02799, 25.02804, 25.02808, 25.02812, 25.02816, 25.02821, 25.02826, 25.0283, + 25.02833, 25.02836, 25.02838, 25.0284, 25.02842, 25.02844, 25.02846, 25.02848, 25.02849, + 25.02852, 25.02854, 25.02856, 25.02858, 25.02861, 25.02863, 25.02865, 25.02867, 25.02869, + 25.02871, 25.02873, 25.02875, 25.02877, 25.02879, 25.02881, 25.02883, 25.02885, 25.02888, + 25.0289, 25.02893, 25.02895, 25.02897, 25.029, 25.02902, 25.02904, 25.02907, 25.02909, + 25.02911, 25.02913, 25.02915, 25.02918, 25.0292, 25.02923, 25.02925, 25.02927, 25.0293, + 25.02932, 25.02934, 25.02937, 25.02939, 25.02941, 25.02942, 25.02944, 25.02946, 25.02949, + 25.02951, 25.02953, 25.02955, 25.02957, 25.02959, 25.02961, 25.02964, 25.02966, 25.02968, + 25.02971, 25.02973, 25.02975, 25.02977, 25.02979, 25.02981, 25.02982, 25.02985, 25.02987, + 25.02989, 25.02991, 25.02993, 25.02996, 25.02997, 25.02999, 25.03002, 25.03004, 25.03006, + 25.03008, 25.03011, 25.03013, 25.03016, 25.03018, 25.03021, 25.03023, 25.03025, 25.03027, + 25.03029, 25.03031, 25.03034, 25.03036, 25.03038, 25.0304, 25.03043, 25.03045, 25.03047, + 25.03049, 25.03051, 25.03054, 25.03056, 25.03058, 25.03059, 25.03061, 25.03064, 25.03066, + 25.03068, 25.0307, 25.03071, 25.03073, 25.03076, 25.03078, 25.0308, 25.03082, 25.03084, + 25.03086, 25.03088, 25.03091, 25.03093, 25.03095, 25.03097, 25.03099, 25.03101, 25.03103, + 25.03105, 25.03107, 25.03109, 25.03112, 25.03114, 25.03116, 25.03119, 25.03121, 25.03123, + 25.03126, 25.03128, 25.0313, 25.03132, 25.03134, 25.03136, 25.03138, 25.0314, 25.03142, + 25.03144, 25.03146, 25.03148, 25.0315, 25.03152, 25.03154, 25.03156, 25.03158, 25.03161, + 25.03163, 25.03165, 25.03167, 25.03169, 25.03171, 25.03173, 25.03175, 25.03177, 25.0318, + 25.03182, 25.03184, 25.03186, 25.03188, 25.0319, 25.03192, 25.03194, 25.03196, 25.03198, + 25.032, 25.03202, 25.03205, 25.03207, 25.03209, 25.03211, 25.03213, 25.03216, 25.03218, + 25.0322, 25.03223, 25.03225, 25.03227, 25.03229, 25.03231, 25.03233, 25.03234, 25.03236, + 25.03238, 25.03241, 25.03243, 25.03245, 25.03248, 25.0325, 25.03253, 25.03255, 25.03257, + 25.03259, 25.03261, 25.03263, 25.03265, 25.03268, 25.0327, 25.03272, 25.03274, 25.03276, + 25.03278, 25.03279, 25.03282, 25.03284, 25.03288, 25.03292, 25.03296, 25.03301, 25.03304, + 25.03308, 25.03311, 25.03313, 25.03315, 25.03317, 25.03318, 25.0332, 25.03322, 25.03325, + 25.03329, 25.03332, 25.03337, 25.03341, 25.03346, 25.0335, 25.03355, 25.03359, 25.03364, + 25.03367, 25.03371, 25.03376, 25.03381, 25.03385, 25.0339, 25.03396, 25.034, 25.03405, + 25.03409, 25.03413, 25.03417, 25.0342, 25.03422, 25.03424, 25.03426, 25.03428, 25.03431, + 25.03434, 25.03437, 25.03441, 25.03444, 25.03446, 25.0345, 25.03452, 25.03455, 25.0346, + 25.03464, 25.03468, 25.03472, 25.03477, 25.03482, 25.03487, 25.03496, 25.03502, 25.03511, + 25.03515, 25.03519, 25.03535, 25.03548, 25.03561, 25.03573, 25.03588, 25.03592, 25.03607, + 25.03625, 25.03645, 25.03667, 25.03683, 25.03688, 25.03697, 25.03702, 25.03706, 25.03712, + 25.03716, 25.0372, 25.03724, 25.03728, 25.03739, 25.03743, 25.03746, 25.03753, 25.0377, + 25.03782, 25.03795, 25.0381, 25.03826, 25.03843, 25.0386, 25.03879, 25.03898, 25.03918, + 25.03941, 25.0396, 25.03978, 25.03999, 25.0402, 25.04038, 25.04044, 25.04049, 25.04053, + 25.04057, 25.04068, 25.04072, 25.04077, 25.04081, 25.04085, 25.04091, 25.04096, 25.041, + 25.04103, 25.04106, 25.04112, 25.04116, 25.0412, 25.04125, 25.04131, 25.04135, 25.0414, + 25.04145, 25.0415, 25.04154, 25.04159, 25.04162, 25.04166, 25.04171, 25.04175, 25.04179, + 25.04183, 25.04187, 25.04192, 25.04196, 25.04201, 25.04205, 25.04212, 25.04216, 25.0422, + 25.04227, 25.0423, 25.04235, 25.0424, 25.04245, 25.04249, 25.04253, 25.04256, 25.0426, + 25.04263, 25.04267, 25.0427, 25.04273, 25.04276, 25.0428, 25.04283, 25.04286, 25.04289, + 25.04292, 25.04295, 25.04298, 25.04302, 25.04306, 25.04309, 25.04312, 25.04316, 25.04319, + 25.04322, 25.04326, 25.04329, 25.04333, 25.04348, 25.0435, 25.04353, 25.04356, 25.04359, + 25.04362, 25.04366, 25.04379, 25.04389, 25.04393, 25.04396, 25.04398, 25.04402, 25.04405, + 25.04407, 25.04411, 25.04414, 25.04416, 25.0442, 25.04424, 25.04427, 25.0443, 25.04439, + 25.04448, 25.04453, 25.0446, 25.04466, 25.04471, 25.04489, 25.04495, 25.04499, 25.045, + 25.04502, 25.04504, 25.04506, 25.04507, 25.04508, 25.04509, 25.04511, 25.04512, 25.04513, + 25.04515, 25.04515, 25.04516, 25.04518, 25.04521, 25.04526, 25.04528, 25.0453, 25.04533, + 25.04535, 25.04537, 25.0454, 25.04542, 25.04544, 25.04547, 25.0455, 25.04554, 25.04558, + 25.04561, 25.04565, 25.0457, 25.04575, 25.0458, 25.04585, 25.0459, 25.04595, 25.046, + 25.04606, 25.0461, 25.04615, 25.04621, 25.04626, 25.04632, 25.04637, 25.04642, 25.04654, + 25.04661, 25.04668, 25.04674, 25.0468, 25.04686, 25.04691, 25.04696, 25.04701, 25.04706, + 25.0471, 25.04714, 25.04718, 25.04724, 25.04726, 25.0473, 25.04733, 25.04737, 25.0474, + 25.04743, 25.04747, 25.04751, 25.04755, 25.04759, 25.04763, 25.04767, 25.04769, 25.04771, + 25.04773, 25.04774, 25.04774, 25.04773, 25.0477, 25.04769, 25.04768, 25.04766, 25.04765, + 25.04764, 25.04766, 25.04769, 25.04769, 25.04769, 25.04769, 25.04765, 25.04762, 25.04761, + 25.04761, 25.04761, 25.04762, 25.04764, 25.04767, 25.0477, 25.04773, 25.04776, 25.04778, + 25.0478, 25.04782, 25.04785, 25.04788, 25.04791, 25.04794, 25.04797, 25.048, 25.04802, + 25.04806, 25.04809, 25.04813, 25.04816, 25.0482, 25.04823, 25.04827, 25.0483, 25.04833, + 25.04836, 25.04839, 25.04842, 25.04849, 25.04861, 25.04865, 25.0487, 25.04873, 25.04877, + 25.04881, 25.04888, 25.04891, 25.04893, 25.04895, 25.04897, 25.04899, 25.04898, 25.04896, + 25.04896, 25.04895, 25.04894, 25.04895, 25.04895, 25.04897, 25.04899, 25.049, 25.04901, + 25.04902, 25.04905, 25.04907, 25.0491, 25.04912, 25.04915, 25.04917, 25.0492, 25.04923, + 25.04927, 25.0493, 25.04934, 25.04939, 25.04944, 25.04948, 25.04953, 25.04958, 25.04962, + 25.04966, 25.0497, 25.04974, 25.04978, 25.04982, 25.04985, 25.04988, 25.0499, 25.04993, + 25.04994, 25.04997, 25.04999, 25.05002, 25.05013, 25.0503, 25.05039, 25.05041, 25.05044, + 25.05046, 25.05048, 25.05051, 25.05055, 25.05059, 25.05063, 25.05068, 25.05074, 25.05079, + 25.05085, 25.05091, 25.05096, 25.05101, 25.05105, 25.05109, 25.05113, 25.05117, 25.0512, + 25.05124, 25.05128, 25.05142, 25.05153, 25.05167, 25.0517, 25.05174, 25.05176, 25.05179, + 25.05182, 25.05185, 25.05196, 25.05203, 25.05206, 25.0521, 25.05211, 25.05214, 25.05218, + 25.05222, 25.05224, 25.05228, 25.05243, 25.05255, 25.05261, 25.05262, 25.05265, 25.05267, + 25.05269, 25.05272, 25.05275, 25.05279, 25.05283, 25.05286, 25.05289, 25.05293, 25.05297, + 25.053, 25.05303, 25.05307, 25.05311, 25.05315, 25.05317, 25.0532, 25.05323, 25.05328, + 25.05332, 25.05337, 25.05341, 25.05345, 25.05348, 25.05352, 25.05355, 25.05358, 25.05361, + 25.05364, 25.05368, 25.05372, 25.05375, 25.05377, 25.05381, 25.05383, 25.05386, 25.05388, + 25.05391, 25.05393, 25.05396, 25.05399, 25.05403, 25.05407, 25.05411, 25.05414, 25.05417, + 25.0542, 25.05424, 25.05426, 25.05429, 25.05432, 25.05435, 25.05437, 25.05444, 25.0545, + 25.05454, 25.05456, 25.05461, 25.05464, 25.05468, 25.05471, 25.05481, 25.05485, 25.05489, + 25.05492, 25.05495, 25.05496, 25.05499, 25.05501, 25.05503, 25.05506, 25.05508, 25.05511, + 25.05513, 25.05515, 25.05517, 25.05519, 25.0552, 25.05522, 25.05525, 25.05528, 25.0553, + 25.05531, 25.05532, 25.05534, 25.05536, 25.05538, 25.05541, 25.05543, 25.05546, 25.05548, + 25.05551, 25.05558, 25.05561, 25.05562, 25.05565, 25.05567, 25.0557, 25.05572, 25.05574, + 25.05576, 25.05578, 25.05579, 25.05582, 25.05582, 25.05583, 25.05584, 25.05585, 25.05586, + 25.05587, 25.05587, 25.05587, 25.05588, 25.05587, 25.05585, 25.05584, 25.05582, 25.05581, + 25.05579, 25.05577, 25.05576, 25.05575, 25.05575, 25.05575, 25.05576, 25.05578, 25.05579, + 25.0558, 25.05581, 25.05583, 25.05583, 25.05584, 25.05585, 25.05586, 25.05589, 25.05591, + 25.05593, 25.05596, 25.05599, 25.05603, 25.05605, 25.05608, 25.0561, 25.05614, 25.05619, + 25.05625, 25.0563, 25.05636, 25.05642, 25.05646, 25.05651, 25.05655, 25.0566, 25.05663, + 25.05667, 25.05671, 25.05675, 25.05679, 25.05683, 25.05687, 25.05691, 25.05695, 25.05699, + 25.05703, 25.05707, 25.05712, 25.05716, 25.05719, 25.05723, 25.05727, 25.05731, 25.05735, + 25.05739, 25.05743, 25.05747, 25.05751, 25.05757, 25.05763, 25.05769, 25.05774, 25.05779, + 25.05785, 25.0579, 25.05795, 25.05801, 25.05806, 25.05812, 25.05817, 25.05823, 25.05828, + 25.05834, 25.05839, 25.05844, 25.0585, 25.05855, 25.0586, 25.05866, 25.05871, 25.05876, + 25.05881, 25.05886, 25.0589, 25.05895, 25.059, 25.05905, 25.05911, 25.05917, 25.05922, + 25.05927, 25.05932, 25.05938, 25.05943, 25.05949, 25.05954, 25.0596, 25.05966, 25.05971, + 25.05977, 25.05983, 25.05989, 25.05994, 25.06, 25.06006, 25.06011, 25.06016, 25.06021, + 25.06027, 25.06033, 25.06038, 25.06042, 25.06048, 25.06054, 25.0606, 25.06066, 25.0607, + 25.06075, 25.0608, 25.06084, 25.06088, 25.06093, 25.06099, 25.06105, 25.06109, 25.06115, + 25.0612, 25.06125, 25.06129, 25.06134, 25.06139, 25.06144, 25.06149, 25.06153, 25.06158, + 25.06162, 25.06166, 25.06171, 25.06175, 25.0618, 25.06185, 25.0619, 25.06196, 25.06201, + 25.06206, 25.06211, 25.06215, 25.06219, 25.06224, 25.06228, 25.06232, 25.06237, 25.06242, + 25.06246, 25.06251, 25.06255, 25.06259, 25.06263, 25.06268, 25.06272, 25.06275, 25.06279, + 25.06282, 25.06285, 25.06288, 25.06291, 25.06293, 25.063, 25.06308, 25.06313, 25.06318, + 25.06323, 25.06327, 25.06332, 25.06336, 25.06341, 25.06346, 25.06351, 25.06356, 25.06362, + 25.06367, 25.06373, 25.06377, 25.06382, 25.06387, 25.06392, 25.06397, 25.06403, 25.06408, + 25.06414, 25.06419, 25.06423, 25.06431, 25.06435, 25.0644, 25.06446, 25.06451, 25.06456, + 25.06462, 25.06467, 25.06473, 25.06477, 25.06483, 25.06488, 25.06493, 25.06498, 25.06502, + 25.06507, 25.06512, 25.06516, 25.0652, 25.06525, 25.0653, 25.06535, 25.0654, 25.06546, + 25.0655, 25.06556, 25.06561, 25.06567, 25.06571, 25.06575, 25.0658, 25.06585, 25.06588, + 25.06592, 25.06595, 25.066, 25.06605, 25.0661, 25.06614, 25.06619, 25.06623, 25.06627, + 25.06632, 25.06638, 25.06644, 25.0665, 25.06655, 25.06662, 25.06668, 25.06674, 25.06681, + 25.06688, 25.06695, 25.06702, 25.06709, 25.06715, 25.06721, 25.06728, 25.06734, 25.06741, + 25.06749, 25.06755, 25.06762, 25.06767, 25.06774, 25.06779, 25.06786, 25.06793, 25.06799, + 25.06805, 25.06811, 25.06818, 25.06823, 25.06829, 25.06836, 25.06842, 25.06848, 25.06854, + 25.06861, 25.06868, 25.06874, 25.06881, 25.06888, 25.06896, 25.06903, 25.0691, 25.06916, + 25.06924, 25.06932, 25.0694, 25.06947, 25.06954, 25.06961, 25.06968, 25.06976, 25.06984, + 25.06991, 25.06998, 25.07006, 25.07014, 25.07022, 25.0703, 25.07037, 25.07044, 25.07052, + 25.07059, 25.07066, 25.07072, 25.07079, 25.07084, 25.07089, 25.07095, 25.07101, 25.07107, + 25.07112, 25.07119, 25.07126, 25.07132, 25.07138, 25.07144, 25.07151, 25.07158, 25.07165, + 25.07171, 25.07177, 25.07185, 25.07192, 25.07199, 25.07206, 25.07212, 25.07218, 25.07224, + 25.07228, 25.07234, 25.0724, 25.07246, 25.07253, 25.07259, 25.07265, 25.0727, 25.07277, + 25.07283, 25.07288, 25.07294, 25.073, 25.07304, 25.07309, 25.07314, 25.07319, 25.07323, + 25.07328, 25.07331, 25.07337, 25.07342, 25.07346, 25.0735, 25.07353, 25.07357, 25.07361, + 25.07366, 25.07371, 25.07374, 25.07377, 25.07379, 25.07382, 25.07385, 25.07387, 25.07391, + 25.07394, 25.07397, 25.074, 25.07402, 25.07404, 25.07407, 25.0741, 25.07412, 25.07414, + 25.07415, 25.07417, 25.07421, 25.07425, 25.07428, 25.07431, 25.07434, 25.07436, 25.07439, + 25.07442, 25.07446, 25.07449, 25.07453, 25.07457, 25.0746, 25.07463, 25.07466, 25.07469, + 25.07472, 25.07475, 25.07478, 25.07481, 25.07484, 25.07487, 25.0749, 25.07493, 25.07496, + 25.075)
\ No newline at end of file diff --git a/mapbox/src/main/java/com/example/mapbox/ui/MapboxMapView.kt b/mapbox/src/main/java/com/example/mapbox/ui/MapboxMapView.kt new file mode 100644 index 0000000000..04fe3828cc --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/ui/MapboxMapView.kt @@ -0,0 +1,282 @@ +package com.example.mapbox.ui + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.Resources +import android.location.Location +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import com.example.mapbox.R +import com.example.mapbox.breadcrumb.ExerciseEngineState +import com.example.mapbox.extensions.getBitmapFromDrawable +import com.example.mapbox.extensions.latLong +import com.mapbox.mapboxsdk.camera.CameraPosition +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.location.LocationComponentOptions +import com.mapbox.mapboxsdk.location.OnCameraTrackingChangedListener +import com.mapbox.mapboxsdk.location.OnLocationCameraTransitionListener +import com.mapbox.mapboxsdk.location.OnLocationStaleListener +import com.mapbox.mapboxsdk.location.modes.CameraMode +import com.mapbox.mapboxsdk.location.modes.RenderMode +import com.mapbox.mapboxsdk.maps.* +import com.soy.android.maps.breadcrumb.Breadcrumb +import com.soy.android.maps.compass.WassCompassEngine +import com.soy.android.maps.extensions.getActivatedLocationComponent +import com.soy.android.maps.extensions.isCameraInTrackingMode +import timber.log.Timber +import kotlin.math.roundToInt + +internal const val INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION = 14 +/** + * Map is centered at Helsinki when we don't have user's current or any last location + */ +private const val DEFAULT_INITIAL_CAMERA_POSITION_LATITUDE = 60.1699 +private const val DEFAULT_INITIAL_CAMERA_POSITION_LONGITUDE = 24.9384 + +private const val CAMERA_ANIMATION_DURATION = 200L + +internal fun buildCameraPosition( + target: LatLng = LatLng(DEFAULT_INITIAL_CAMERA_POSITION_LATITUDE, DEFAULT_INITIAL_CAMERA_POSITION_LONGITUDE), + zoomIndex: Int = INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION +) = CameraPosition.Builder().target(target).zoom(zoomIndex.toDouble()).build() + +/** + * [MapboxMapOptions] can either be applied via xml or programmatically when [MapView] is + * constructed. This function provides a predefined set of options. + */ +private fun createMapboxMapOptions(resources: Resources, location: Location?): MapboxMapOptions { + val cameraPosition = if (location == null) { + // Use default location and zoom level + buildCameraPosition() + } else { + buildCameraPosition(LatLng(location.latitude, location.longitude), INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION) + } + return MapboxMapOptions().apply { + val compassImageTopMargin = resources.getDimension(R.dimen.size_spacing_xxsmall).roundToInt() + compassMargins(intArrayOf(0, compassImageTopMargin, 0, 0)) + compassEnabled(true) + compassImage(resources.getDrawable(R.drawable.ic_shape_north_indicator, null)) + compassGravity(Gravity.CENTER) + textureMode(true) + attributionEnabled(false) + logoEnabled(false) + zoomGesturesEnabled(true) + compassFadesWhenFacingNorth(false) + rotateGesturesEnabled(false) + camera(cameraPosition) + } +} + +internal const val START_SYMBOL_ICON_ID = "id-start-icon" +internal const val PAUSE_LINE_PATTERN = "id-stale-line-pattern" + +/** + * This class extends [MapView] and is suggested to use when creating map programmatically with a + * given cameraPosition which is used to center the camera on map. This view doesn't allow touch + * interactions for the child views of [MapView] such as compass, logo, attribute. + */ +@SuppressLint("ViewConstructor") +class MapboxMapView( + context: Context, + location: Location? = null, + private val isBreadcrumbEnabled: Boolean = true +) : MapView(context, createMapboxMapOptions(context.resources, location)), OnLocationStaleListener, + OnCameraTrackingChangedListener, MapboxMap.OnMapClickListener, OnMapReadyCallback, MapboxMap.OnMapLongClickListener { + + init { + id = View.generateViewId() + } + + private var map: MapboxMap? = null + + private var breadcrumb: Breadcrumb? = null + + private var exerciseEngineState = ExerciseEngineState.Recording + + /** + * A boolean which keeps track of location stale status. Initially location is assigned to be stale since there is + * no gps fix at start up. The value changes in two places: + * 1- When [onStaleStateChange] is invoked, the value is updated based on the parameter + * 2- Whenever there is new gps fix it is set to be false + */ + private var isLocationStale = true + + internal var compassEngine: WassCompassEngine? = null + @CameraMode.Mode + private var lastCameraTrackingMode = CameraMode.TRACKING_COMPASS + private var cameraZoomLevelIndex = INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION + private var isDefaultCameraPositionInUse = false + + override fun onMapReady(mapboxMap: MapboxMap) { + map = mapboxMap.apply { + setStyle(Style.Builder() + .withImage(START_SYMBOL_ICON_ID, resources.getBitmapFromDrawable(R.drawable.ic_map_start_pin)) + .withImage(PAUSE_LINE_PATTERN, resources.getBitmapFromDrawable(R.drawable.ic_stale_track_dot)) + .fromUrl(context.getString(R.string.asoy_mapbox_style)) + ) { style -> + startLocationComponent(mapboxMap, style) + if (isBreadcrumbEnabled) { + breadcrumb = Breadcrumb(this@MapboxMapView, mapboxMap, style) + } + } + addOnMapLongClickListener(this@MapboxMapView) + addOnMapClickListener(this@MapboxMapView) + } + } + + // Location + @SuppressLint("MissingPermission") + private fun startLocationComponent(mapboxMap: MapboxMap, style: Style) { + mapboxMap.locationComponent.apply { + // Activate with options. If location engine is null, push location updates to + // the component without any internal engine management. No engine is going to + // be initialized and you can push location updates with + // [LocationComponent#forceLocationUpdate(Location)]. + activateLocationComponent( + context, + style, + null, + LocationComponentOptions.createFromAttributes(context, R.style.mapbox_location) + ) + compassEngine = this@MapboxMapView.compassEngine + addOnCameraTrackingChangedListener(this@MapboxMapView) + isLocationComponentEnabled = true + Timber.d("Mapbox Location Component is enabled") + addOnLocationStaleListener(this@MapboxMapView) + renderMode = RenderMode.GPS + cameraMode = lastCameraTrackingMode + } + } + + internal fun onNewLocation(location: Location) { + isLocationStale = false + map?.run { + getActivatedLocationComponent()?.run { + if (isDefaultCameraPositionInUse) { + updateMapCameraZoom(INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION) + isDefaultCameraPositionInUse = false + } + forceLocationUpdate(location) + breadcrumb?.onNewLocation(location.latLong(), exerciseEngineState) + } + } + } + + override fun onStaleStateChange(isStale: Boolean) { + Timber.d("Location stale state change. Is Stale: $isStale") + isLocationStale = isStale + map?.getActivatedLocationComponent()?.run { + renderMode = if (isStale) RenderMode.NORMAL else RenderMode.GPS + val locationComponentStyle = if (isStale) R.style.mapbox_stale_location else R.style.mapbox_location + applyStyle(LocationComponentOptions.createFromAttributes(context, locationComponentStyle)) + } + } + + // Camera + private fun updateMapCameraZoom(zoomLevelIndex: Int) = map?.getActivatedLocationComponent()?.run { + cameraZoomLevelIndex = zoomLevelIndex + if (cameraMode != CameraMode.NONE) { + zoomWhileTracking(getCameraZoomLevel(), CAMERA_ANIMATION_DURATION) + } else { + map?.easeCamera(CameraUpdateFactory.zoomTo(getCameraZoomLevel())) + } + } + + private fun getCameraZoomLevel(): Double = map?.cameraPosition?.zoom ?: 0.0 + + override fun onCameraTrackingChanged(currentMode: Int) { + Timber.d("Camera tracking mode changed. Current mode: $currentMode") + if (map?.isCameraInTrackingMode() == true) { + lastCameraTrackingMode = currentMode + } + } + + /** + * Invoked whenever camera tracking is broken. + */ + override fun onCameraTrackingDismissed() { + Timber.d("Exiting from camera tracking mode") + updateCameraMode(CameraMode.NONE_COMPASS) + } + + private fun updateCameraMode(@CameraMode.Mode mode: Int) { + // We need to + map?.getActivatedLocationComponent()?.apply { + if (cameraMode != CameraMode.NONE) { + setCameraMode(mode, object : OnLocationCameraTransitionListener { + override fun onLocationCameraTransitionFinished(cameraMode: Int) { + zoomWhileTracking(getCameraZoomLevel(), CAMERA_ANIMATION_DURATION) + } + + override fun onLocationCameraTransitionCanceled(cameraMode: Int) { + // No impl. + } + }) + } else { + cameraMode = mode + } + } + } + + // Gestures + /** + * When [MapboxMap.OnMapClickListener.onMapClick] is called camera mode is updated: + * There are two camera tracking modes enabled: + * The [CameraMode.TRACKING_GPS_NORTH] sets the camera always to the north and the [CameraMode.TRACKING_COMPASS] + * sets the location indicator to north and map rotates according to heading + * If camera mode is [CameraMode.TRACKING_GPS_NORTH], onClick switches the mode to [CameraMode.TRACKING_COMPASS] + * If camera mode is [CameraMode.TRACKING_COMPASS] onClick switches the mode to [CameraMode.TRACKING_GPS_NORTH] + * If user starts panning while in tracking mode, camera switches to [CameraMode.NONE_COMPASS] mode and user is not + * tracked by camera. On click switches the camera back to last used tracking mode + */ + override fun onMapClick(point: LatLng): Boolean { + map?.getActivatedLocationComponent()?.apply { + when (cameraMode) { + CameraMode.TRACKING_GPS_NORTH -> updateCameraMode(CameraMode.TRACKING_COMPASS) + CameraMode.TRACKING_COMPASS -> updateCameraMode(CameraMode.TRACKING_GPS_NORTH) + CameraMode.NONE_COMPASS, + CameraMode.NONE, + CameraMode.NONE_GPS -> updateCameraMode(lastCameraTrackingMode) + else -> Timber.w("Using unsupported camera mode") + } + } + return true + } + + /** + * Used for mocking exercise pause / resmume controls + */ + override fun onMapLongClick(point: LatLng): Boolean { + if (exerciseEngineState == ExerciseEngineState.Paused) { + exerciseEngineState = ExerciseEngineState.Recording + } else if (exerciseEngineState == ExerciseEngineState.Recording) { + exerciseEngineState = ExerciseEngineState.Paused + } + return true + } + + /** + * By overriding this method, we prevent compass view component of the [MapView] from consuming the clicks + */ + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + super.onInterceptTouchEvent(ev) + return true + } + + override fun onResume() { + super.onResume() + breadcrumb?.onResume() + } + + override fun onStop() { + breadcrumb?.onStop() + super.onStop() + } + + override fun onDestroy() { + breadcrumb?.onDestroy() + super.onDestroy() + } +} diff --git a/mapbox/src/main/java/com/example/mapbox/ui/extensions/ConstraintLayoutExtensions.kt b/mapbox/src/main/java/com/example/mapbox/ui/extensions/ConstraintLayoutExtensions.kt new file mode 100644 index 0000000000..84fa569e1b --- /dev/null +++ b/mapbox/src/main/java/com/example/mapbox/ui/extensions/ConstraintLayoutExtensions.kt @@ -0,0 +1,19 @@ +package com.example.mapbox.ui.extensions + +import android.support.constraint.ConstraintLayout +import android.support.constraint.ConstraintSet +import android.view.View + +fun ConstraintLayout.addViewAndMatchItToParent(view: View, zIndex: Int = 0) { + addView(view, zIndex) + ConstraintSet().run { + clone(this@addViewAndMatchItToParent) + view.run { + connect(id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP) + connect(id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START) + connect(id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END) + connect(id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM) + } + applyTo(this@addViewAndMatchItToParent) + } +} diff --git a/mapbox/src/main/res/drawable/ic_map_location_indicator_bg.xml b/mapbox/src/main/res/drawable/ic_map_location_indicator_bg.xml new file mode 100644 index 0000000000..3c9d98734e --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_map_location_indicator_bg.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#000000" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12 0c6.627 0 12 5.373 12 12s-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0z"/> +</vector> diff --git a/mapbox/src/main/res/drawable/ic_map_location_indicator_bg_stale.xml b/mapbox/src/main/res/drawable/ic_map_location_indicator_bg_stale.xml new file mode 100644 index 0000000000..b4a001cecc --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_map_location_indicator_bg_stale.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#80000000" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12 0c6.627 0 12 5.373 12 12s-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0z"/> +</vector> diff --git a/mapbox/src/main/res/drawable/ic_map_location_indicator_dark.xml b/mapbox/src/main/res/drawable/ic_map_location_indicator_dark.xml new file mode 100644 index 0000000000..311d16a69a --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_map_location_indicator_dark.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#000000" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12 0c6.627 0 12 5.373 12 12s-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0z"/> + <path android:fillColor="#FFFFFF" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12.044 3.67l5.782 14.773c0.053 0.142-0.099 0.278-0.233 0.208l-5.386-2.92-5.797 2.882a0.164 0.164 0 0 1-0.227-0.21L12.044 3.67z"/> +</vector> diff --git a/mapbox/src/main/res/drawable/ic_map_location_indicator_icon.xml b/mapbox/src/main/res/drawable/ic_map_location_indicator_icon.xml new file mode 100644 index 0000000000..128bdf1ad1 --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_map_location_indicator_icon.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#FFFFFF" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12.044 3.67l5.782 14.773c0.053 0.142-0.099 0.278-0.233 0.208l-5.386-2.92-5.797 2.882a0.164 0.164 0 0 1-0.227-0.21L12.044 3.67z"/> +</vector> diff --git a/mapbox/src/main/res/drawable/ic_map_location_indicator_stale.xml b/mapbox/src/main/res/drawable/ic_map_location_indicator_stale.xml new file mode 100644 index 0000000000..0f59ef0767 --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_map_location_indicator_stale.xml @@ -0,0 +1,3 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> + <path android:name="stale_icon" android:fillColor="#FFFFFF" android:pathData="M15.5234048,12.9703272 L19.6202888,17.0672112 L18.6922112,17.9952888 L6.00471117,5.30778883 L6.93278883,4.37971117 L11.0281757,8.47509808 L18.9589195,5.07632634 L15.5234048,12.9703272 Z M14.4298894,15.4829671 L12.3438817,20.2761199 C12.278246,20.4214306 12.0649298,20.4088271 12.0171947,20.256844 L10.174919,14.1018988 L3.74261709,11.9259455 C3.58971567,11.8755316 3.58001948,11.6657208 3.72844574,11.6034448 L8.50384064,9.55691829 L14.4298894,15.4829671 Z"/> +</vector> diff --git a/mapbox/src/main/res/drawable/ic_map_start_pin.xml b/mapbox/src/main/res/drawable/ic_map_start_pin.xml new file mode 100644 index 0000000000..b6b368a756 --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_map_start_pin.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="34dp" + android:height="70dp" + android:viewportWidth="34" + android:viewportHeight="70"> + + <path + android:fillColor="@color/base_red" + android:pathData="M 17 30 C 19.7614237492 30 22 32.2385762508 22 35 C 22 37.7614237492 19.7614237492 40 17 40 C 14.2385762508 40 12 37.7614237492 12 35 C 12 32.2385762508 14.2385762508 30 17 30 Z" /> + <path + android:fillColor="@color/base_black" + android:pathData="M 17 33 C 18.1045694997 33 19 33.8954305003 19 35 C 19 36.1045694997 18.1045694997 37 17 37 C 15.8954305003 37 15 36.1045694997 15 35 C 15 33.8954305003 15.8954305003 33 17 33 Z" /> + <path + android:fillColor="@color/base_black" + + android:pathData="M16.5,15 L2.5638852,15 C1.67236646,15 1.34908022,14.9071744 1.0231543,14.7328673 C0.697228371,14.5585602 0.441439796,14.3027716 0.267132704,13.9768457 C0.0928256111,13.6509198 4.01235366e-17,13.3276335 -6.90560205e-17,12.4361148 L6.90560205e-17,2.5638852 C-4.01235366e-17,1.67236646 0.0928256111,1.34908022 0.267132704,1.0231543 C0.441439796,0.697228371 0.697228371,0.441439796 1.0231543,0.267132704 C1.34908022,0.0928256111 1.67236646,6.01853049e-17 2.5638852,-1.03584031e-16 L31.4361148,1.03584031e-16 C32.3276335,-6.01853049e-17 32.6509198,0.0928256111 32.9768457,0.267132704 C33.3027716,0.441439796 33.5585602,0.697228371 33.7328673,1.0231543 C33.9071744,1.34908022 34,1.67236646 34,2.5638852 L34,12.4361148 C34,13.3276335 33.9071744,13.6509198 33.7328673,13.9768457 C33.5585602,14.3027716 33.3027716,14.5585602 32.9768457,14.7328673 C32.6509198,14.9071744 32.3276335,15 31.4361148,15 L17.5,15 L17.5,35 L16.5,35 L16.5,15 Z" /> + <path + android:fillColor="@color/base_white" + android:pathData="M7.8046875,8.5078125 C7.8046875,8.28645723 7.72656328,8.11653705 7.5703125,7.99804688 C7.41406172,7.8795567 7.13281453,7.75455795 6.7265625,7.62304688 C6.32031047,7.4915358 5.9986991,7.3619798 5.76171875,7.234375 C5.11588219,6.88541492 4.79296875,6.41536754 4.79296875,5.82421875 C4.79296875,5.51692555 4.87955643,5.24283975 5.05273438,5.00195312 C5.22591232,4.7610665 5.47460775,4.57291734 5.79882812,4.4375 C6.1230485,4.30208266 6.48697715,4.234375 6.890625,4.234375 C7.29687703,4.234375 7.65885258,4.30794197 7.9765625,4.45507812 C8.29427242,4.60221428 8.54101475,4.80989449 8.71679688,5.078125 C8.892579,5.34635551 8.98046875,5.65103996 8.98046875,5.9921875 L7.80859375,5.9921875 C7.80859375,5.73176953 7.72656332,5.5292976 7.5625,5.38476562 C7.39843668,5.24023365 7.16797023,5.16796875 6.87109375,5.16796875 C6.58463398,5.16796875 6.36197996,5.22851502 6.203125,5.34960938 C6.04427004,5.47070373 5.96484375,5.63020734 5.96484375,5.828125 C5.96484375,6.01302176 6.05794178,6.16796812 6.24414062,6.29296875 C6.43033947,6.41796938 6.70442527,6.5351557 7.06640625,6.64453125 C7.73307625,6.84505309 8.21874848,7.09374852 8.5234375,7.390625 C8.82812652,7.68750148 8.98046875,8.05728945 8.98046875,8.5 C8.98046875,8.99218996 8.7942727,9.37825381 8.421875,9.65820312 C8.0494773,9.93815244 7.54818023,10.078125 6.91796875,10.078125 C6.48046656,10.078125 6.08203305,9.99804768 5.72265625,9.83789062 C5.36327945,9.67773357 5.08919365,9.45833473 4.90039062,9.1796875 C4.7115876,8.90104027 4.6171875,8.57812684 4.6171875,8.2109375 L5.79296875,8.2109375 C5.79296875,8.8385448 6.167965,9.15234375 6.91796875,9.15234375 C7.19661598,9.15234375 7.41406172,9.09570369 7.5703125,8.98242188 C7.72656328,8.86914006 7.8046875,8.71093852 7.8046875,8.5078125 Z M14.0546875,5.26171875 L12.3125,5.26171875 L12.3125,10 L11.140625,10 L11.140625,5.26171875 L9.421875,5.26171875 L9.421875,4.3125 L14.0546875,4.3125 L14.0546875,5.26171875 Z M17.9335938,8.828125 L15.8789062,8.828125 L15.4882812,10 L14.2421875,10 L16.359375,4.3125 L17.4453125,4.3125 L19.5742188,10 L18.328125,10 L17.9335938,8.828125 Z M16.1953125,7.87890625 L17.6171875,7.87890625 L16.9023438,5.75 L16.1953125,7.87890625 Z M22.2109375,7.91796875 L21.2773438,7.91796875 L21.2773438,10 L20.1054688,10 L20.1054688,4.3125 L22.21875,4.3125 C22.8906284,4.3125 23.4088523,4.46223809 23.7734375,4.76171875 C24.1380227,5.06119941 24.3203125,5.48437227 24.3203125,6.03125 C24.3203125,6.41927277 24.236329,6.74283725 24.0683594,7.00195312 C23.9003898,7.261069 23.645835,7.46744715 23.3046875,7.62109375 L24.5351562,9.9453125 L24.5351562,10 L23.2773438,10 L22.2109375,7.91796875 Z M21.2773438,6.96875 L22.2226562,6.96875 C22.5169286,6.96875 22.7447909,6.89388096 22.90625,6.74414062 C23.0677091,6.59440029 23.1484375,6.38802215 23.1484375,6.125 C23.1484375,5.85676949 23.0722664,5.6458341 22.9199219,5.4921875 C22.7675774,5.3385409 22.5338557,5.26171875 22.21875,5.26171875 L21.2773438,5.26171875 L21.2773438,6.96875 Z M29.4921875,5.26171875 L27.75,5.26171875 L27.75,10 L26.578125,10 L26.578125,5.26171875 L24.859375,5.26171875 L24.859375,4.3125 L29.4921875,4.3125 L29.4921875,5.26171875 Z" /> +</vector>
\ No newline at end of file diff --git a/mapbox/src/main/res/drawable/ic_shape_north_indicator.xml b/mapbox/src/main/res/drawable/ic_shape_north_indicator.xml new file mode 100644 index 0000000000..63d833e875 --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_shape_north_indicator.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="227dp" android:height="227dp" android:viewportWidth="227" android:viewportHeight="227"> + <path android:fillColor="#FF5640" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M106 15.25L113.5 4l7.5 11.25z"/> +</vector> diff --git a/mapbox/src/main/res/drawable/ic_stale_track_dot.xml b/mapbox/src/main/res/drawable/ic_stale_track_dot.xml new file mode 100644 index 0000000000..ac1af5c13f --- /dev/null +++ b/mapbox/src/main/res/drawable/ic_stale_track_dot.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="8dp" + android:height="4dp" + android:viewportWidth="8" + android:viewportHeight="4"> + <path + android:fillColor="@color/base_red" + android:pathData="M 0 4 L 0 0 L 4 0 L 4 4 Z" /> +</vector>
\ No newline at end of file diff --git a/mapbox/src/main/res/layout/activity_main.xml b/mapbox/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000000..d944c444fa --- /dev/null +++ b/mapbox/src/main/res/layout/activity_main.xml @@ -0,0 +1,7 @@ +<android.support.constraint.ConstraintLayout + xmlns:tools="http://schemas.android.com/tools" + xmlns:android="http://schemas.android.com/apk/res/android" + tools:deviceIds="wear" + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent"/> diff --git a/mapbox/src/main/res/mipmap-hdpi/ic_launcher.png b/mapbox/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..898f3ed59a --- /dev/null +++ b/mapbox/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/mapbox/src/main/res/mipmap-mdpi/ic_launcher.png b/mapbox/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..64ba76f75e --- /dev/null +++ b/mapbox/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/mapbox/src/main/res/mipmap-xhdpi/ic_launcher.png b/mapbox/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..e5ed46597e --- /dev/null +++ b/mapbox/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/mapbox/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mapbox/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 0000000000..b0907cac3b --- /dev/null +++ b/mapbox/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/mapbox/src/main/res/values/colors.xml b/mapbox/src/main/res/values/colors.xml new file mode 100644 index 0000000000..6d23e04896 --- /dev/null +++ b/mapbox/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="map_accuracy">#1EB3EA</color> + <color name="base_black">#000000</color> + <color name="base_red">#ff5640</color> + <color name="base_white">#ffffff</color> +</resources>
\ No newline at end of file diff --git a/mapbox/src/main/res/values/dimens.xml b/mapbox/src/main/res/values/dimens.xml new file mode 100644 index 0000000000..361a98b11d --- /dev/null +++ b/mapbox/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <dimen name="size_spacing_xxsmall">2dp</dimen> +</resources> diff --git a/mapbox/src/main/res/values/strings.xml b/mapbox/src/main/res/values/strings.xml new file mode 100644 index 0000000000..3a051a6df5 --- /dev/null +++ b/mapbox/src/main/res/values/strings.xml @@ -0,0 +1,9 @@ +<resources> + <string name="app_name">Maps Sample</string> + <string name="user_location_permission_explanation">Location permission needed</string> + <string name="user_location_permission_not_granted">Location permission not granted</string> + <string name="mapbox_api_key" translatable="false"> + sk.eyJ1IjoiYXNkaWdpdGFsIiwiYSI6ImNqb3JnbHJubzBkcWwzcXBoeHdhcWFxc3EifQ.vieGHep6o91dwji46TwOcw + </string> + <string name="asoy_mapbox_style" translatable="false">asset://map_style.json</string> +</resources>
\ No newline at end of file diff --git a/mapbox/src/main/res/values/styles.xml b/mapbox/src/main/res/values/styles.xml new file mode 100644 index 0000000000..eaba3be0ed --- /dev/null +++ b/mapbox/src/main/res/values/styles.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Mapbox Location Component attributes --> + <style name="mapbox_location" parent="mapbox_location_common"> + <item name="mapbox_foregroundDrawable">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_backgroundDrawable">@drawable/ic_map_location_indicator_bg</item> + <item name="mapbox_bearingDrawable">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_gpsDrawable">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_foregroundDrawableStale">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_backgroundDrawableStale">@drawable/ic_map_location_indicator_bg</item> + </style> + + <!-- Mapbox Location Component attributes when Rendering mode is GPS and location is stale --> + <style name="mapbox_stale_location" parent="mapbox_location_common"> + <item name="mapbox_foregroundDrawable">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_backgroundDrawable">@drawable/ic_map_location_indicator_bg_stale</item> + <item name="mapbox_bearingDrawable">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_gpsDrawable">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_foregroundDrawableStale">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_backgroundDrawableStale">@drawable/ic_map_location_indicator_bg_stale</item> + </style> + + <style name="mapbox_location_common"> + <item name="mapbox_uiZoomGestures">false</item> + <item name="mapbox_uiCompass">false</item> + <item name="mapbox_uiAttribution">false</item> + <item name="mapbox_uiLogo">false</item> + <item name="mapbox_uiRotateGestures">false</item> + <item name="mapbox_accuracyAlpha">0.2</item> + <item name="mapbox_accuracyAnimationEnabled">true</item> + <item name="mapbox_accuracyColor">@color/map_accuracy</item> + <item name="mapbox_trackingGesturesManagement">true</item> + <item name="mapbox_renderTextureMode">true</item> + <item name="mapbox_enableStaleState">true</item> + <item name="mapbox_staleStateTimeout">2000</item> + </style> +</resources>
\ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/assets/small_poly.geojson b/platform/android/MapboxGLAndroidSDKTestApp/src/main/assets/small_poly.geojson deleted file mode 100644 index ec61303c72..0000000000 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/assets/small_poly.geojson +++ /dev/null @@ -1 +0,0 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-122.28813171386719,38.617406963286136],[-122.26959228515624,38.6833657775237],[-122.18238830566406,38.55568323796419],[-122.10617065429688,38.51378825951165],[-122.11509704589845,38.50465406475561],[-122.18307495117188,38.542795073979015],[-122.19955444335938,38.496593518947556],[-122.28813171386719,38.617406963286136]]]}}]}
\ No newline at end of file diff --git a/platform/android/wearapp/gradle/wrapper/gradle-wrapper.jar b/platform/android/wearapp/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 0000000000..f6b961fd5a --- /dev/null +++ b/platform/android/wearapp/gradle/wrapper/gradle-wrapper.jar diff --git a/platform/android/wearapp/gradle/wrapper/gradle-wrapper.properties b/platform/android/wearapp/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..66bc7166b2 --- /dev/null +++ b/platform/android/wearapp/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jul 02 13:42:44 PDT 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/platform/android/wearapp/gradlew b/platform/android/wearapp/gradlew new file mode 100644 index 0000000000..cccdd3d517 --- /dev/null +++ b/platform/android/wearapp/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/platform/android/wearapp/gradlew.bat b/platform/android/wearapp/gradlew.bat new file mode 100644 index 0000000000..e95643d6a2 --- /dev/null +++ b/platform/android/wearapp/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/platform/android/wearapp/src/main/AndroidManifest.xml b/platform/android/wearapp/src/main/AndroidManifest.xml index e6a29a1897..82f7d7fe8c 100644 --- a/platform/android/wearapp/src/main/AndroidManifest.xml +++ b/platform/android/wearapp/src/main/AndroidManifest.xml @@ -1,36 +1,40 @@ <?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" - package="com.mapbox.mapboxsdk.wearapp"> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.mapbox"> - <uses-permission android:name="android.permission.WAKE_LOCK"/> - - <uses-feature android:name="android.hardware.type.watch"/> + <uses-permission android:name="android.permission.WAKE_LOCK" /> + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-feature android:name="android.hardware.type.watch" /> <application - android:allowBackup="true" - android:icon="@mipmap/ic_launcher" - android:label="@string/app_name" - android:supportsRtl="true" - android:theme="@android:style/Theme.DeviceDefault.NoActionBar"> + android:allowBackup="true" + android:name=".MapboxApp" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:supportsRtl="true" + android:theme="@style/Theme.Wearable.Modal"> <uses-library - android:name="com.google.android.wearable" - android:required="true"/> + android:name="com.google.android.wearable" + android:required="true" /> <!-- Set to true if your app is Standalone, that is, it does not require the handheld app to run. --> <meta-data - android:name="com.google.android.wearable.standalone" - android:value="true"/> + android:name="com.google.android.wearable.standalone" + android:value="true" /> <activity - android:name=".MainActivity" - android:label="@string/app_name"> + android:name=".MainActivity" + android:theme="@style/Theme.Wearable.Modal" + android:label="@string/app_name"> <intent-filter> - <action android:name="android.intent.action.MAIN"/> + <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER"/> + <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> diff --git a/platform/android/wearapp/src/main/assets/map_style.json b/platform/android/wearapp/src/main/assets/map_style.json new file mode 100755 index 0000000000..cf5af01fa1 --- /dev/null +++ b/platform/android/wearapp/src/main/assets/map_style.json @@ -0,0 +1,6322 @@ +{ + "version": 8, + "name": "Suunto-Terrain-v2", + "metadata": { + "mapbox:autocomposite": true, + "mapbox:type": "default", + "mapbox:groups": { + "1444934828655.3389": {"name": "Aeroways", "collapsed": true}, + "1444933322393.2852": { + "name": "POI labels (scalerank 1)", + "collapsed": true + }, + "1444934749452.0452": {"name": "Wetlands", "collapsed": true}, + "1444855786460.0557": {"name": "Roads", "collapsed": true}, + "1444933575858.6992": { + "name": "Highway shields", + "collapsed": true + }, + "1444934295202.7542": { + "name": "Admin boundaries", + "collapsed": true + }, + "1444856151690.9143": {"name": "State labels", "collapsed": true}, + "1444933721429.3076": {"name": "Road labels", "collapsed": false}, + "1444933358918.2366": { + "name": "POI labels (scalerank 2)", + "collapsed": false + }, + "1444933808272.805": {"name": "Water labels", "collapsed": true}, + "1444855815295.714": {"name": "Hillshading", "collapsed": true}, + "1444855831248.8289": {"name": "Landcover", "collapsed": true}, + "1444933372896.5967": { + "name": "POI labels (scalerank 3)", + "collapsed": true + }, + "1444855799204.86": {"name": "Bridges", "collapsed": true}, + "1444856087950.3635": {"name": "Marine labels", "collapsed": true}, + "1444862510685.128": {"name": "City labels", "collapsed": true}, + "1444855769305.6016": {"name": "Tunnels", "collapsed": true}, + "1444856144497.7825": { + "name": "Country labels", + "collapsed": false + }, + "1444933456003.5437": { + "name": "POI labels (scalerank 4)", + "collapsed": true + }, + "1444933837268.9458": {"name": "Contour lines", "collapsed": true} + }, + "mapbox:trackposition": true, + "mapbox:sdk-support": { + "js": "0.40.0", + "android": "5.2.0", + "ios": "3.7.0" + } + }, + "center": [25.894779104000122, 60.989524088929244], + "zoom": 13.49759503660035, + "bearing": 0, + "pitch": 0, + "sources": { + "composite": { + "url": "mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v7,asdigital.3xmf51gt,asdigital.4ndqaw5i,asdigital.8gn75sun,asdigital.bx9emb57,asdigital.cin65rxq,asdigital.3zhx939u,asdigital.dj8hnewo,asdigital.3z3k4hf4,asdigital.41m0ih21,asdigital.akzrezo9,asdigital.20xyxn8p,asdigital.72fqy08s", + "type": "vector" + } + }, + "sprite": "mapbox://sprites/asdigital/ciqnol3nm002fc5lvsyci972q", + "glyphs": "mapbox://fonts/asdigital/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "layout": {"visibility": "visible"}, + "paint": { + "background-color": { + "base": 1, + "stops": [[11, "#f3f0e0"], [14, "hsl(51, 40%, 88%)"]] + } + }, + "interactive": true + }, + { + "id": "landcover_crop", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": ["==", "class", "crop"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[0, "#f1ecd5"], [10, "#e6e5bc"]] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[3, 0.6], [7, 0.5], [12, 0]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_grass", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": ["==", "class", "grass"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[0, "#eee7c9"], [10, "#e6e5bc"]] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[1, 0], [3, 0.6], [7, 0.4], [11, 0]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_scrub", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": ["==", "class", "scrub"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [0, "hsl(49, 42%, 83%)"], + [10, "hsl(49, 52%, 87%)"] + ] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[3, 0.6], [7, 0.5], [12, 0]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_wood", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[7, "#d5d1ae"], [10, "#d3db8f"]] + }, + "fill-opacity": { + "base": 1.5, + "stops": [[4, 0.25], [8, 0.1], [11, 0.1], [15, 0.3]] + }, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "landcover_wood_pattern", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [7, "hsl(53, 32%, 76%)"], + [10, "hsl(66, 51%, 71%)"] + ] + }, + "fill-opacity": {"base": 1.5, "stops": [[12, 0], [14, 0.25]]}, + "fill-antialias": false, + "fill-pattern": "wood" + }, + "interactive": true + }, + { + "id": "landcover_snow", + "type": "fill", + "metadata": {"mapbox:group": "1444855831248.8289"}, + "source": "composite", + "source-layer": "landcover", + "filter": ["==", "class", "snow"], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": 0.3, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "national_park", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "filter": ["==", "class", "national_park"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(66, 41%, 64%)", + "fill-opacity": { + "base": 1, + "stops": [[5, 0], [5.5, 0.2], [9, 0.25]] + } + }, + "interactive": true + }, + { + "id": "park", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "all", + ["!in", "type", "garden", "golf_course", "playground", "zoo"], + ["==", "class", "park"] + ], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [10, "hsl(59, 44%, 75%)"], + [14, "hsl(65, 53%, 79%)"] + ] + }, + "fill-opacity": {"base": 1, "stops": [[3, 0], [12, 0.5]]} + }, + "interactive": true + }, + { + "id": "scrub", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 9, + "filter": ["==", "class", "scrub"], + "layout": {}, + "paint": { + "fill-color": "#f2f0d4", + "fill-opacity": {"base": 1, "stops": [[9, 0.2], [12, 0]]} + }, + "interactive": true + }, + { + "id": "grass", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 9, + "filter": ["==", "class", "grass"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "#f2f0d4", + "fill-opacity": {"base": 1, "stops": [[9, 0.4], [12, 0]]} + }, + "interactive": true + }, + { + "id": "wood", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 6, + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[6, "#e4dfbb"], [10, "#d3db8f"]] + }, + "fill-opacity": { + "base": 1, + "stops": [[7, 0.1], [12, 0.4], [15, 0.3]] + } + }, + "interactive": true + }, + { + "id": "wood_pattern", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 6, + "filter": ["==", "class", "wood"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[7, "#e4dfbb"], [10, "#d3db8f"]] + }, + "fill-opacity": {"base": 1, "stops": [[12, 0], [14, 0.25]]}, + "fill-pattern": "wood" + }, + "interactive": true + }, + { + "id": "agriculture", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 11, + "filter": ["==", "class", "agriculture"], + "layout": {}, + "paint": { + "fill-opacity": {"base": 1, "stops": [[11, 0], [16, 0.5]]}, + "fill-color": "hsl(54, 82%, 89%)", + "fill-outline-color": "hsl(54, 63%, 84%)" + }, + "interactive": true + }, + { + "id": "national_park-tint-band", + "type": "line", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 7, + "filter": ["==", "class", "national_park"], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(72, 47%, 66%)", + "line-width": {"base": 1.4, "stops": [[9, 1], [14, 6]]}, + "line-offset": {"base": 1.4, "stops": [[9, 0], [14, -2.5]]}, + "line-opacity": {"base": 1, "stops": [[7, 0], [10, 0.4]]}, + "line-blur": 3 + }, + "interactive": true + }, + { + "id": "national_park-outline", + "type": "line", + "source": "composite", + "source-layer": "landuse_overlay", + "minzoom": 7, + "filter": ["==", "class", "national_park"], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 36%, 64%)", + "line-width": {"base": 1, "stops": [[9, 0.75], [12, 1]]}, + "line-offset": 0, + "line-opacity": {"base": 1, "stops": [[7, 0], [13, 1]]} + }, + "interactive": true + }, + { + "id": "hospital", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "hospital"], + "layout": {}, + "paint": {"fill-color": "#ebe8d8"}, + "interactive": true + }, + { + "id": "school", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "school"], + "layout": {}, + "paint": {"fill-color": "#ebe8d8", "fill-opacity": 1}, + "interactive": true + }, + { + "id": "other-green-areas", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "all", + ["==", "class", "park"], + ["in", "type", "garden", "golf_course", "playground", "zoo"] + ], + "layout": {}, + "paint": { + "fill-color": "#e1e6ad", + "fill-opacity": {"base": 1, "stops": [[9, 0], [11, 0.7]]} + }, + "interactive": true + }, + { + "id": "glacier", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "minzoom": 9, + "filter": ["==", "class", "glacier"], + "layout": {}, + "paint": { + "fill-color": "hsl(196, 78%, 96%)", + "fill-opacity": {"base": 1, "stops": [[9, 0], [10, 0.5]]} + }, + "interactive": true + }, + { + "id": "pitch", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "pitch"], + "layout": {"visibility": "visible"}, + "paint": {"fill-color": "hsl(0, 0%, 100%)", "fill-opacity": 0.3}, + "interactive": true + }, + { + "id": "pitch-line", + "type": "line", + "source": "composite", + "source-layer": "landuse", + "minzoom": 15, + "filter": ["==", "class", "pitch"], + "layout": {"line-join": "miter"}, + "paint": {"line-color": "hsl(75, 29%, 85%)"}, + "interactive": true + }, + { + "id": "cemetery", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "cemetery"], + "layout": {}, + "paint": {"fill-color": "#e1e6ad", "fill-opacity": 0.7}, + "interactive": true + }, + { + "id": "industrial", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "industrial"], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": {"base": 1, "stops": [[6, 0], [10, 0.3]]} + }, + "interactive": true + }, + { + "id": "sand", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": ["==", "class", "sand"], + "layout": {}, + "paint": {"fill-color": "hsl(51, 60%, 95%)"}, + "interactive": true + }, + { + "id": "contour-line", + "type": "line", + "metadata": {"mapbox:group": "1444933837268.9458"}, + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": ["!in", "index", 10, 5], + "layout": {}, + "paint": { + "line-opacity": {"base": 1, "stops": [[11, 0.15], [12, 0.3]]}, + "line-color": { + "base": 1, + "stops": [[12, "#748c37"], [14, "#868c76"]] + }, + "line-width": {"base": 1, "stops": [[13, 0.5], [16, 0.8]]}, + "line-offset": {"base": 1, "stops": [[13, 1], [16, 1.6]]} + }, + "interactive": true + }, + { + "id": "contour-line-index", + "type": "line", + "metadata": {"mapbox:group": "1444933837268.9458"}, + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": ["in", "index", 10, 5], + "layout": {}, + "paint": { + "line-opacity": {"base": 1, "stops": [[11, 0.3], [12, 0.5]]}, + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(77, 44%, 38%)"], + [14, "hsl(77, 9%, 51%)"] + ] + }, + "line-width": {"base": 1, "stops": [[13, 0.6], [16, 1.2]]}, + "line-offset": {"base": 1, "stops": [[13, 0.6], [16, 1.2]]} + }, + "interactive": true + }, + { + "id": "hillshade_highlight_bright", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 18, + "filter": ["==", "level", 94], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": {"stops": [[15, 0.15], [18, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_highlight_med", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "filter": ["==", "level", 90], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 100%)", + "fill-opacity": {"stops": [[15, 0.15], [18, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_faint", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 17, + "filter": ["==", "level", 89], + "layout": {}, + "paint": { + "fill-color": "#543c17", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_med", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "filter": ["==", "level", 78], + "layout": {}, + "paint": { + "fill-color": "#543c17", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_dark", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "filter": ["==", "level", 67], + "layout": {}, + "paint": { + "fill-color": "#581470", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "hillshade_shadow_extreme", + "type": "fill", + "metadata": {"mapbox:group": "1444855815295.714"}, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 17, + "filter": ["==", "level", 56], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(284, 47%, 27%)", + "fill-opacity": {"stops": [[12, 0.07], [17, 0]]}, + "fill-antialias": false + }, + "interactive": true + }, + { + "id": "waterway-river-canal-shadow", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "filter": ["in", "class", "canal", "river"], + "layout": { + "line-cap": {"base": 1, "stops": [[0, "butt"], [11, "round"]]}, + "line-join": "round" + }, + "paint": { + "line-color": "hsl(220, 53%, 74%)", + "line-width": {"base": 1.3, "stops": [[8.5, 0.4], [20, 8]]}, + "line-opacity": {"base": 1, "stops": [[8, 0], [8.5, 1]]}, + "line-translate": { + "base": 1.2, + "stops": [[7, [0, 0]], [16, [-1, -1]]] + }, + "line-translate-anchor": "viewport" + }, + "interactive": true + }, + { + "id": "waterway-river-canal", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "filter": ["in", "class", "canal", "river"], + "layout": { + "line-cap": {"base": 1, "stops": [[0, "butt"], [11, "round"]]}, + "line-join": "round" + }, + "paint": { + "line-color": "hsl(208, 27%, 84%)", + "line-width": {"base": 1.3, "stops": [[8.5, 0.4], [20, 8]]}, + "line-opacity": {"base": 1, "stops": [[8, 0], [8.5, 1]]} + }, + "interactive": true + }, + { + "id": "waterway-small", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 13, + "filter": ["!in", "class", "canal", "river"], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(217, 71%, 73%)", + "line-width": {"base": 1.35, "stops": [[13.5, 0.4], [20, 3]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.5, 1]]} + }, + "interactive": true + }, + { + "id": "water-shadow", + "type": "fill", + "source": "composite", + "source-layer": "water", + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(215, 67%, 79%)", + "fill-translate": { + "base": 1.2, + "stops": [[7, [0, 0]], [16, [-1, -1]]] + }, + "fill-translate-anchor": "viewport", + "fill-opacity": 1 + }, + "interactive": true + }, + { + "id": "water", + "type": "fill", + "source": "composite", + "source-layer": "water", + "layout": {}, + "paint": { + "fill-color": { + "base": 1, + "stops": [[1, "hsl(219, 26%, 88%)"], [10, "#cfdce7"]] + } + }, + "interactive": true + }, + { + "id": "wetlands", + "type": "fill", + "metadata": {"mapbox:group": "1444934749452.0452"}, + "source": "composite", + "source-layer": "landuse_overlay", + "filter": ["in", "class", "wetland", "wetland_noveg"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(162, 39%, 48%)", + "fill-opacity": 0.1, + "fill-outline-color": "hsla(146, 37%, 67%, 0)" + }, + "interactive": true + }, + { + "id": "wetlands-pattern", + "type": "fill", + "metadata": {"mapbox:group": "1444934749452.0452"}, + "source": "composite", + "source-layer": "landuse_overlay", + "filter": ["in", "class", "wetland", "wetland_noveg"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "hsl(185, 43%, 74%)", + "fill-opacity": {"base": 1, "stops": [[11, 0], [16, 0.35]]}, + "fill-translate-anchor": "viewport", + "fill-pattern": "wetland2" + }, + "interactive": true + }, + { + "id": "barrier_line-land-polygon", + "type": "fill", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["==", "class", "land"] + ], + "layout": {}, + "paint": {"fill-color": "hsl(53, 7%, 76%)"}, + "interactive": true + }, + { + "id": "barrier_line-land-line", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "class", "land"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": {"base": 1.99, "stops": [[14, 0.75], [20, 40]]}, + "line-color": "#c7c6bf" + }, + "interactive": true + }, + { + "id": "aeroway-polygon", + "type": "fill", + "metadata": {"mapbox:group": "1444934828655.3389"}, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + ["!=", "type", "apron"], + ["==", "$type", "Polygon"] + ], + "layout": {}, + "paint": { + "fill-color": "#d6d4c9", + "fill-opacity": {"base": 1, "stops": [[11, 0], [11.5, 1]]} + }, + "interactive": true + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": {"mapbox:group": "1444934828655.3389"}, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "type", "runway"] + ], + "layout": {}, + "paint": { + "line-color": "hsl(51, 14%, 81%)", + "line-width": {"base": 1.5, "stops": [[9, 1], [18, 80]]} + }, + "interactive": true + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": {"mapbox:group": "1444934828655.3389"}, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "type", "taxiway"] + ], + "layout": {}, + "paint": { + "line-color": "#d6d4c9", + "line-width": {"base": 1.5, "stops": [[10, 0.5], [18, 20]]} + }, + "interactive": true + }, + { + "id": "building", + "type": "fill", + "source": "composite", + "source-layer": "building", + "minzoom": 15, + "filter": ["==", "underground", "false"], + "layout": {}, + "paint": { + "fill-color": "hsl(54, 20%, 85%)", + "fill-opacity": {"base": 1, "stops": [[15.5, 0], [16, 1]]}, + "fill-outline-color": "hsla(35, 13%, 71%, 0.3)" + }, + "interactive": true + }, + { + "id": "tunnel-street-low", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(38, 24%, 80%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "tunnel-street_limited-low", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(38, 24%, 80%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "tunnel-track-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#a69577", + "line-gap-width": {"base": 1.5, "stops": [[15, 1], [18, 12]]}, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-service-link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "hsl(35, 20%, 74%)", + "line-gap-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-street_limited-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "hsl(35, 20%, 74%)", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3], + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-street-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "hsl(36, 24%, 67%)", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3], + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-secondary-tertiary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.2, "stops": [[10, 0.75], [18, 2]]}, + "line-dasharray": [3, 3], + "line-gap-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsl(34, 23%, 78%)" + }, + "interactive": true + }, + { + "id": "tunnel-primary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "primary"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-dasharray": [3, 3], + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#d4cdc4" + }, + "interactive": true + }, + { + "id": "tunnel-trunk_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#bfb09c", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-motorway_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#bfb09c", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-trunk-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["==", "type", "trunk"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "hsl(34, 21%, 68%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": 1, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-motorway-case", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "#bfb09d", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": 1, + "line-dasharray": [3, 3] + }, + "interactive": true + }, + { + "id": "tunnel-construction", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["==", "class", "construction"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#c9c3b9", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "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]] + ] + } + }, + "interactive": true + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "type", "cycleway", "piste", "steps"], + ["==", "class", "path"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [3, 0.4]], + [16, [3, 0.35]], + [17, [3, 0.35]] + ] + }, + "line-color": "#c9c3b9", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-cycleway-piste", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "tunnel"], + ["in", "type", "cycleway", "piste"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [3, 0.4]], + [16, [3, 0.35]], + [17, [3, 0.35]] + ] + }, + "line-color": "hsl(10, 100%, 81%)", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-steps", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "structure", "tunnel"], ["==", "type", "steps"]] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[15, 1], [16, 1.6], [18, 6]] + }, + "line-color": "#c9c3b9", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.4]], + [16, [0.75, 0.4]], + [17, [0.3, 0.3]] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-trunk_link", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "tunnel-motorway_link", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsla(0, 0%, 100%, 0.8)", + "line-opacity": 1, + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "tunnel-pedestrian", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "tunnel"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "#c9c3b9", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [[14, [1, 0]], [15, [1.5, 0.4]], [16, [1, 0.2]]] + } + }, + "interactive": true + }, + { + "id": "tunnel-track", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 12]]}, + "line-color": "hsl(0, 0%, 91%)" + }, + "interactive": true + }, + { + "id": "tunnel-service-link", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "tunnel-street_limited", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#c9c3b9", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-street", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "tunnel-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-opacity": 1, + "line-dasharray": [1, 0], + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "tunnel-primary", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "primary"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-opacity": 1, + "line-dasharray": [1, 0], + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "tunnel-oneway-arrows-blue-minor", + "type": "symbol", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "oneway", "true"], + ["==", "structure", "tunnel"], + [ + "in", + "class", + "link", + "path", + "pedestrian", + "service", + "track" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[17, "oneway-small"], [18, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "tunnel-oneway-arrows-blue-major", + "type": "symbol", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "oneway", "true"], + ["==", "structure", "tunnel"], + [ + "in", + "class", + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[16, "oneway-small"], [17, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "tunnel-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "trunk"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsla(0, 0%, 100%, 0.9)" + }, + "interactive": true + }, + { + "id": "tunnel-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "tunnel"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-dasharray": [1, 0], + "line-opacity": 1, + "line-color": "hsla(0, 0%, 100%, 0.9)", + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "tunnel-oneway-arrows-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444855769305.6016"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "!in", + "type", + "primary_link", + "secondary_link", + "tertiary_link" + ], + ["==", "oneway", "true"], + ["==", "structure", "tunnel"], + ["in", "class", "link", "trunk"] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [ + [16, "oneway-white-small"], + [17, "oneway-white-large"] + ] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {"icon-opacity": 0.5}, + "interactive": true + }, + { + "id": "cliffs", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 15, + "filter": ["==", "class", "cliff"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-opacity": {"base": 1, "stops": [[15, 0], [15.25, 1]]}, + "line-width": 10, + "line-pattern": "cliff2" + }, + "interactive": true + }, + { + "id": "ferry", + "type": "line", + "source": "composite", + "source-layer": "road", + "filter": ["==", "type", "ferry"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "base": 1, + "stops": [[10, "#b6c8e0"], [17, "#5986c5"]] + }, + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]}, + "line-dasharray": { + "base": 1, + "stops": [[12, [1, 0]], [13, [12, 4]]] + } + }, + "interactive": true + }, + { + "id": "ferry-auto", + "type": "line", + "source": "composite", + "source-layer": "road", + "filter": ["==", "type", "ferry_auto"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [10, "hsl(215, 41%, 80%)"], + [17, "hsl(215, 48%, 56%)"] + ] + }, + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]} + }, + "interactive": true + }, + { + "id": "road-pedestrian-polygon-fill", + "type": "fill", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "Polygon"], + [ + "all", + ["==", "structure", "none"], + ["in", "class", "path", "pedestrian"] + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(54, 40%, 92%)", + "fill-outline-color": "hsla(0, 0%, 100%, 0)", + "fill-opacity": {"base": 1, "stops": [[12, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "europe-from-1-1-to-1-4-3-2 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_1_to_1_4_3_2", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-1-4-3-3-to-3-1-1 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_4_3_3_to_3_1_1", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-1-2-to-3-2-1-2-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_1_2_to_3_2_1_2_4", + "minzoom": 10, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-2-1-3-to-3-2-3 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_1_3_to_3_2_3", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-2-4-to-4-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_4_to_4_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-dasharray": [2, 0], + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "antarctica copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "antarctica", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "australia-oceania copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "australia_oceania", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "africa-all copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "africa_all", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "america-from-1-to-2-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_1_to_2_4", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "asia-all copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "asia_all", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "america-from-3-to-4-4 copy", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_3_to_4_4", + "minzoom": 11, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsl(59, 100%, 93%)", + "line-width": {"base": 1, "stops": [[15, 2.5], [22, 8]]}, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [12, 0.7], [14.3, 0.7], [14.6, 0]] + }, + "line-blur": 1 + }, + "interactive": true + }, + { + "id": "europe-from-3-2-1-3-to-3-2-3", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_1_3_to_3_2_3", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "europe-from-3-1-2-to-3-2-1-2-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_1_2_to_3_2_1_2_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "europe-from-1-4-3-3-to-3-1-1", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_4_3_3_to_3_1_1", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "europe-from-1-1-to-1-4-3-2", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_1_1_to_1_4_3_2", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "america-from-3-to-4-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_3_to_4_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "asia-all", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "asia_all", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "america-from-1-to-2-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "america_from_1_to_2_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "africa-all", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "africa_all", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "australia-oceania", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "australia_oceania", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "antarctica", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "antarctica", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + } + }, + "interactive": true + }, + { + "id": "europe-from-3-2-4-to-4-4", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "europe_from_3_2_4_to_4_4", + "minzoom": 10, + "maxzoom": 15, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(29, 13%, 68%)"], + [14, "hsl(37, 12%, 50%)"] + ] + }, + "line-opacity": { + "base": 1, + "stops": [[11, 0], [11.7, 1], [14.3, 1], [14.6, 0]] + }, + "line-width": {"base": 1, "stops": [[14, 1.2], [22, 6]]}, + "line-dasharray": { + "base": 1, + "stops": [[11, [1, 0]], [13, [3, 0.4]]] + } + }, + "interactive": true + }, + { + "id": "road-path-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + [ + "!in", + "type", + "corridor", + "crossing", + "piste", + "sidewalk", + "steps" + ], + ["==", "class", "path"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2], [18, 10]]}, + "line-opacity": {"base": 1, "stops": [[14.3, 0], [14.5, 1]]}, + "line-color": "hsl(75, 100%, 97%)", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "road-sidewalk-corridor-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "type", "corridor", "crossing", "sidewalk"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2], [18, 10]]}, + "line-dasharray": [1, 0], + "line-color": "hsl(0, 0%, 100%)", + "line-blur": 0, + "line-opacity": {"base": 1, "stops": [[16, 0], [16.25, 1]]} + }, + "interactive": true + }, + { + "id": "road-piste-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["==", "type", "piste"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2.7], [19, 10.4]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.5, 1]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-blur": 0 + }, + "interactive": true + }, + { + "id": "road-track-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "track"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 2.2], [19, 10]]}, + "line-color": "#8f8370", + "line-gap-width": 0, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.1, 1]]} + }, + "interactive": true + }, + { + "id": "road-steps-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "steps"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2.5], [18, 8]]}, + "line-color": "#fbfff0", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 0.6]]} + }, + "interactive": true + }, + { + "id": "road-pedestrian-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2], [18, 14.5]]}, + "line-color": "#c4c0b9", + "line-gap-width": 0, + "line-opacity": {"base": 1, "stops": [[14.75, 0], [15, 1]]} + }, + "interactive": true + }, + { + "id": "road-street-low", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "street"], ["==", "structure", "none"]] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 1.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11, 0], [11.25, 1], [13, 1], [13.25, 0]] + } + }, + "interactive": true + }, + { + "id": "road-street_limited-low", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11, 0], [11.25, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "road-service-link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.2], [20, 2]]}, + "line-color": "#c4c0b9", + "line-gap-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-opacity": {"base": 1, "stops": [[14.5, 0], [15, 1]]} + }, + "interactive": true + }, + { + "id": "road-street_limited-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 1], [20, 2]]}, + "line-color": "hsl(36, 9%, 75%)", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "road-street-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "street"], ["==", "structure", "none"]] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 1], [20, 2]]}, + "line-color": "#c4c0b9", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0], [13, 1.2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.5, 1]]} + }, + "interactive": true + }, + { + "id": "road-secondary-tertiary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.2, "stops": [[10, 0.75], [18, 2.6]]}, + "line-color": "#c1bdb6", + "line-gap-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-opacity": {"base": 1, "stops": [[10.5, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "road-primary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "primary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2.6]]}, + "line-color": "#c1bdb6", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": {"base": 1, "stops": [[9, 0], [10, 1]]} + }, + "interactive": true + }, + { + "id": "road-motorway_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "road-trunk_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "road-trunk-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "trunk"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[9, 1], [16, 2]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": {"base": 1, "stops": [[7.9, 0], [8, 1]]} + }, + "interactive": true + }, + { + "id": "road-motorway-case", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[9, 1], [16, 2]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-opacity": {"base": 1, "stops": [[7.9, 0], [8, 1]]} + }, + "interactive": true + }, + { + "id": "road-construction", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "construction"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(36, 9%, 67%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "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]] + ] + } + }, + "interactive": true + }, + { + "id": "road-sidewalk-corridor", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "type", "corridor", "crossing", "sidewalk"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "hsl(36, 13%, 68%)", + "line-dasharray": [1, 0], + "line-opacity": {"base": 1, "stops": [[16, 0], [16.25, 1]]} + }, + "interactive": true + }, + { + "id": "road-path-smooth", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["in", "type", "bridleway", "footway", "path"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 1.2], [18, 4]]}, + "line-color": "#8f8370", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [3, 0.4]], + [15, [3, 0.4]], + [16, [3, 0.35]], + [17, [3, 0.35]] + ] + }, + "line-opacity": {"base": 1, "stops": [[14.2, 0], [14.4, 1]]} + }, + "interactive": true + }, + { + "id": "road-path-rough", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["in", "type", "hiking", "mountain_bike", "trail"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 1.2], [18, 4]]}, + "line-color": "#8f8370", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.6]], + [16, [1, 0.6]], + [17, [1, 0.35]] + ] + }, + "line-opacity": {"base": 1, "stops": [[14.2, 0], [14.4, 1]]} + }, + "interactive": true + }, + { + "id": "road-track", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "track"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.4], [18, 4]]}, + "line-color": "#fbffed", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.1, 1]]}, + "line-dasharray": [3, 0] + }, + "interactive": true + }, + { + "id": "road-cycleway", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["==", "type", "cycleway"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.4], [18, 4]]}, + "line-color": "hsl(0, 92%, 76%)", + "line-opacity": {"base": 1, "stops": [[14.2, 0], [14.3, 1]]}, + "line-dasharray": [3, 0.35] + }, + "interactive": true + }, + { + "id": "road-steps", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "steps"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[15, 1], [16, 1.6], [18, 6]] + }, + "line-color": "hsl(43, 8%, 46%)", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.4]], + [16, [0.75, 0.4]], + [17, [0.3, 0.3]] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "road-trunk_link", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bebebe", + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "road-motorway_link", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bfbdb0", + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "road-pedestrian", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "none"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 1], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [[14, [1, 0]], [15, [1.5, 0.4]], [16, [1, 0.2]]] + } + }, + "interactive": true + }, + { + "id": "road-piste", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "path"], + ["==", "type", "piste"] + ] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.4], [18, 4]]}, + "line-color": { + "base": 1, + "stops": [ + [12, "hsl(250, 47%, 70%)"], + [16, "hsl(220, 67%, 63%)"] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-dasharray": [3, 0.35] + }, + "interactive": true + }, + { + "id": "road-service-link", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "link", "service"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.2], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)" + }, + "interactive": true + }, + { + "id": "road-street_limited", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "none"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "road-street", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "street"], ["==", "structure", "none"]] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [13, 1.2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.1, 1]]} + }, + "interactive": true + }, + { + "id": "road-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 8, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[8.9, 0], [9, 1]]} + }, + "interactive": true + }, + { + "id": "road-primary", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "primary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[5, 0], [5.5, 1]]} + }, + "interactive": true + }, + { + "id": "road-oneway-arrows-blue-minor", + "type": "symbol", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["==", "oneway", "true"], + [ + "in", + "class", + "link", + "path", + "pedestrian", + "service", + "track" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[17, "oneway-small"], [18, "oneway-large"]] + }, + "icon-rotation-alignment": "map", + "icon-padding": 2, + "symbol-spacing": 200 + }, + "paint": {}, + "interactive": true + }, + { + "id": "road-oneway-arrows-blue-major", + "type": "symbol", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["!in", "structure", "bridge", "tunnel"], + ["==", "oneway", "true"], + [ + "in", + "class", + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[16, "oneway-small"], [17, "oneway-large"]] + }, + "icon-rotation-alignment": "map", + "icon-padding": 2, + "symbol-spacing": 200 + }, + "paint": {}, + "interactive": true + }, + { + "id": "road-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "trunk"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": { + "base": 1, + "stops": [ + [7.9, "hsl(0, 0%, 99%)"], + [8, "hsl(257, 19%, 73%)"] + ] + } + }, + "interactive": true + }, + { + "id": "road-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": { + "base": 1, + "stops": [ + [7.9, "hsl(0, 0%, 100%)"], + [8, "hsl(43, 61%, 67%)"] + ] + } + }, + "interactive": true + }, + { + "id": "road-rail", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [[13, "#cccabe"], [16, "hsl(24, 7%, 66%)"]] + }, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]}, + "line-opacity": {"base": 1, "stops": [[12, 0], [13, 1]]} + }, + "interactive": true + }, + { + "id": "road-rail-tracks", + "type": "line", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [[13, "hsl(50, 12%, 77%)"], [16, "#ada6a1"]] + }, + "line-width": {"base": 1.5, "stops": [[14, 4], [20, 8]]}, + "line-dasharray": [0.1, 15], + "line-opacity": {"base": 1, "stops": [[13.75, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "road-oneway-arrows-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444855786460.0557"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["!in", "structure", "bridge", "tunnel"], + [ + "!in", + "type", + "primary_link", + "secondary_link", + "tertiary_link" + ], + ["==", "oneway", "true"], + ["in", "class", "link", "trunk"] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [ + [16, "oneway-white-small"], + [17, "oneway-white-large"] + ] + }, + "icon-padding": 2, + "symbol-spacing": 200 + }, + "paint": {"icon-opacity": 0.5}, + "interactive": true + }, + { + "id": "hedges", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 16, + "filter": ["==", "class", "hedge"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(70, 41%, 66%)", + "line-width": {"base": 1, "stops": [[16, 1], [20, 3]]}, + "line-opacity": 1, + "line-dasharray": [1, 2, 5, 2, 1, 2] + }, + "interactive": true + }, + { + "id": "fences", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 16, + "filter": ["==", "class", "fence"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(46, 17%, 76%)", + "line-width": {"base": 1, "stops": [[16, 1], [20, 3]]}, + "line-opacity": 1, + "line-dasharray": [1, 2, 5, 2, 1, 2] + }, + "interactive": true + }, + { + "id": "gates", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "minzoom": 17, + "filter": ["==", "class", "gate"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(46, 17%, 76%)", + "line-width": {"base": 1, "stops": [[16, 1], [20, 3]]}, + "line-opacity": 0.5, + "line-dasharray": [1, 2, 5, 2, 1, 2] + }, + "interactive": true + }, + { + "id": "bridge-path-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "type", "piste", "steps"], + ["==", "class", "path"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2.5], [18, 11]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-color": "#fbfff0", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-path-bg copy", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "cycleway"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2.6], [19, 10.4]]}, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-color": "#fffadb", + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-piste-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "piste"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2.6], [19, 10.4]]}, + "line-dasharray": [1, 0], + "line-color": "#fbfff0", + "line-blur": 0, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-steps-bg", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "structure", "bridge"], ["==", "type", "steps"]] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 2.5], [18, 8]]}, + "line-color": "#fffadb", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-blur": {"base": 1, "stops": [[14, 0], [17, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-pedestrian-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "bridge"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 2], [18, 14.5]]}, + "line-color": "hsl(230, 24%, 87%)", + "line-gap-width": 0, + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-street-low", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "bridge-street_limited-low", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": { + "stops": [[11.5, 0], [12, 1], [14, 1], [14.01, 0]] + } + }, + "interactive": true + }, + { + "id": "bridge-track-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 2.7], [19, 10.4]]}, + "line-color": "#9f927f", + "line-gap-width": 0 + }, + "interactive": true + }, + { + "id": "bridge-service-link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "bridge"], + ["in", "class", "link", "service"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#d1c7b8", + "line-gap-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]} + }, + "interactive": true + }, + { + "id": "bridge-street_limited-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#d1c7b8", + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + } + }, + "interactive": true + }, + { + "id": "bridge-street-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#c9baa6", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "line-gap-width": { + "base": 1.5, + "stops": [[13, 0], [14, 2], [18, 18]] + } + }, + "interactive": true + }, + { + "id": "bridge-secondary-tertiary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.2, "stops": [[10, 0.75], [18, 2]]}, + "line-color": "#d4cdc4", + "line-gap-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-translate": [0, 0] + }, + "interactive": true + }, + { + "id": "bridge-primary-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "primary"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "#bfb09d", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-translate": [0, 0] + }, + "interactive": true + }, + { + "id": "bridge-trunk_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway_link-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "bridge-trunk-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "trunk"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "#fff", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [16, 2]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-construction", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["==", "class", "construction"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(36, 4%, 38%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "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]] + ] + } + }, + "interactive": true + }, + { + "id": "bridge-path", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "type", "cycleway", "piste", "steps"], + ["==", "class", "path"], + ["==", "structure", "bridge"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "#8a7d69", + "line-dasharray": [2, 0], + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-cycleway", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "cycleway"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "#fa8989", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-piste", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "path"], + ["==", "structure", "bridge"], + ["==", "type", "piste"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1], [18, 4]]}, + "line-color": "#618ce0", + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]}, + "line-dasharray": [2, 0] + }, + "interactive": true + }, + { + "id": "bridge-steps", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "structure", "bridge"], ["==", "type", "steps"]] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[15, 1], [16, 1.6], [18, 6]] + }, + "line-color": "hsl(43, 10%, 55%)", + "line-dasharray": { + "base": 1, + "stops": [ + [14, [4, 0.4]], + [15, [1.75, 0.4]], + [16, [0.75, 0.4]], + [17, [0.3, 0.3]] + ] + }, + "line-opacity": {"base": 1, "stops": [[13, 0], [13.25, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-trunk_link", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bebebe" + }, + "interactive": true + }, + { + "id": "bridge-motorway_link", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bfbdb0" + }, + "interactive": true + }, + { + "id": "bridge-pedestrian", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["==", "class", "pedestrian"], + ["==", "structure", "bridge"] + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [[14, [1, 0]], [15, [1.5, 0.4]], [16, [1, 0.2]]] + } + }, + "interactive": true + }, + { + "id": "bridge-track", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "track"], + ["==", "structure", "bridge"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[15, 1.2], [18, 4]]}, + "line-color": "#f8f7e8", + "line-dasharray": [1, 0] + }, + "interactive": true + }, + { + "id": "bridge-service-link", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + ["!=", "type", "trunk_link"], + ["==", "structure", "bridge"], + ["in", "class", "link", "service", "track"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-width": {"base": 1.5, "stops": [[14, 0.5], [18, 12]]}, + "line-color": "hsl(0, 0%, 100%)" + }, + "interactive": true + }, + { + "id": "bridge-street_limited", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street_limited"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(35, 14%, 93%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-street", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "street"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12.5, 0.5], [14, 2], [18, 18]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "type", "secondary", "tertiary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[8.5, 0.5], [10, 0.75], [18, 26]] + }, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[5, 0], [5.5, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-primary", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "structure", "bridge"], + ["==", "type", "primary"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": {"base": 1.2, "stops": [[5, 0], [5.5, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-oneway-arrows-blue-minor", + "type": "symbol", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + ["==", "oneway", "true"], + ["==", "structure", "bridge"], + [ + "in", + "class", + "link", + "path", + "pedestrian", + "service", + "track" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[17, "oneway-small"], [18, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "bridge-oneway-arrows-blue-major", + "type": "symbol", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", "true"], + ["==", "structure", "bridge"], + [ + "in", + "class", + "primary", + "secondary", + "street", + "street_limited", + "tertiary" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [[16, "oneway-small"], [17, "oneway-large"]] + }, + "symbol-spacing": 200, + "icon-rotation-alignment": "map", + "icon-padding": 2 + }, + "paint": {}, + "interactive": true + }, + { + "id": "bridge-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "trunk"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#bebebe" + }, + "interactive": true + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["!in", "layer", 2, 3, 4, 5], + ["==", "class", "motorway"], + ["==", "structure", "bridge"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#bfbdb0" + }, + "interactive": true + }, + { + "id": "bridge-rail", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [[13, "hsl(50, 17%, 82%)"], [16, "#9c998f"]] + }, + "line-width": {"base": 1.5, "stops": [[14, 0.5], [20, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-rail-tracks", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["in", "class", "major_rail", "minor_rail"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": { + "stops": [ + [13, "hsl(50, 17%, 82%)"], + [16, "hsl(49, 6%, 59%)"] + ] + }, + "line-width": {"base": 1.5, "stops": [[14, 4], [20, 8]]}, + "line-dasharray": [0.1, 15], + "line-opacity": {"base": 1, "stops": [[13.75, 0], [20, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-trunk_link-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": {"base": 1, "stops": [[10.99, 0], [11, 1]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway_link-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[12, 0.75], [20, 2]]}, + "line-color": "#fff", + "line-gap-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-opacity": 1 + }, + "interactive": true + }, + { + "id": "bridge-trunk-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "trunk"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[10, 1], [16, 2]]}, + "line-color": "#bfb09c", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-motorway-2-case", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[10, 1], [16, 2]]}, + "line-color": "#fff", + "line-gap-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]} + }, + "interactive": true + }, + { + "id": "bridge-trunk_link-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "structure", "bridge"], + ["==", "type", "trunk_link"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#bebebe" + }, + "interactive": true + }, + { + "id": "bridge-motorway_link-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": { + "base": 1.5, + "stops": [[12, 0.5], [14, 2], [18, 18]] + }, + "line-color": "#b8b59d" + }, + "interactive": true + }, + { + "id": "bridge-trunk-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "trunk"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "hsl(0, 0%, 100%)" + }, + "interactive": true + }, + { + "id": "bridge-motorway-2", + "type": "line", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "structure", "bridge"], + [">=", "layer", 2] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-width": {"base": 1.5, "stops": [[5, 0.75], [18, 32]]}, + "line-color": "#bfbdb0" + }, + "interactive": true + }, + { + "id": "bridge-oneway-arrows-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444855799204.86"}, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "!in", + "type", + "primary_link", + "secondary_link", + "tertiary_link" + ], + ["==", "oneway", "true"], + ["==", "structure", "bridge"], + ["in", "class", "link", "trunk"] + ], + "layout": { + "symbol-placement": "line", + "icon-image": { + "base": 1, + "stops": [ + [16, "oneway-white-small"], + [17, "oneway-white-large"] + ] + }, + "symbol-spacing": 200, + "icon-padding": 2 + }, + "paint": {"icon-opacity": 0.5}, + "interactive": true + }, + { + "id": "aerialway-bg-gondola-chairlift", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "in", + "type", + "aerialway:chair_lift", + "aerialway:drag_lift", + "aerialway:gondola" + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(220, 21%, 32%)", + "line-width": { + "base": 1.5, + "stops": [[10, 0.5], [12, 1], [20, 8]] + }, + "line-blur": 0.5, + "line-opacity": {"base": 1, "stops": [[12, 0.6], [13, 1]]} + }, + "interactive": true + }, + { + "id": "aerialway-gondola-chairlift", + "type": "line", + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "in", + "type", + "aerialway:chair_lift", + "aerialway:drag_lift", + "aerialway:gondola" + ], + "layout": { + "line-join": "round", + "visibility": "visible", + "line-cap": "round" + }, + "paint": { + "line-color": "#607194", + "line-width": { + "base": 1.5, + "stops": [[10, 1.2], [12, 2], [18, 8]] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [10, [0.01, 3, 0.01]], + [13, [0.01, 6, 0.01]], + [16, [0.02, 10, 0.02]] + ] + }, + "line-opacity": {"base": 1, "stops": [[12, 0.4], [13, 1]]} + }, + "interactive": true + }, + { + "id": "contour-label", + "type": "symbol", + "source": "composite", + "source-layer": "contour", + "minzoom": 11, + "filter": ["in", "index", 10, 5], + "layout": { + "text-field": "{ele} m", + "symbol-placement": "line", + "text-max-angle": 25, + "text-padding": 5, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[15, 9.5], [20, 12]]} + }, + "paint": { + "text-color": "hsl(77, 21%, 37%)", + "text-halo-width": 1, + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 100%, 0.5)" + }, + "interactive": true + }, + { + "id": "admin-2-boundaries-bg", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": ["all", ["==", "admin_level", 2], ["==", "maritime", 0]], + "layout": {"line-join": "miter"}, + "paint": { + "line-width": {"base": 1, "stops": [[3, 3.5], [10, 8]]}, + "line-color": "#fffadb", + "line-opacity": {"base": 1, "stops": [[3, 0], [4, 0.5]]}, + "line-translate": [0, 0], + "line-blur": {"base": 1, "stops": [[3, 0], [10, 2]]} + }, + "interactive": true + }, + { + "id": "admin-3-4-boundaries-bg", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "filter": ["all", ["==", "maritime", 0], [">=", "admin_level", 3]], + "layout": {"line-join": "bevel", "visibility": "visible"}, + "paint": { + "line-color": "hsl(52, 100%, 98%)", + "line-width": {"base": 1, "stops": [[7, 3.75], [12, 8]]}, + "line-opacity": {"base": 1, "stops": [[11, 0], [12, 0.9]]}, + "line-dasharray": [1, 0], + "line-translate": [0, 0], + "line-blur": {"base": 1, "stops": [[3, 0], [8, 2]]} + }, + "interactive": true + }, + { + "id": "admin-3-4-boundaries", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "filter": ["all", ["==", "maritime", 0], [">=", "admin_level", 3]], + "layout": { + "line-join": "round", + "line-cap": "round", + "visibility": "visible" + }, + "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": [ + [6, "hsl(47, 27%, 79%)"], + [10, "hsl(32, 7%, 52%)"] + ] + } + }, + "interactive": true + }, + { + "id": "admin-2-boundaries-dispute", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + ["==", "admin_level", 2], + ["==", "disputed", 1], + ["==", "maritime", 0] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-dasharray": [1.5, 1.5], + "line-color": "#8c7e6e", + "line-width": {"base": 1, "stops": [[3, 0.5], [10, 2]]} + }, + "interactive": true + }, + { + "id": "admin-2-boundaries", + "type": "line", + "metadata": {"mapbox:group": "1444934295202.7542"}, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + ["==", "admin_level", 2], + ["==", "disputed", 0], + ["==", "maritime", 0] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(33, 12%, 49%)", + "line-width": {"base": 1, "stops": [[3, 0.5], [10, 2]]}, + "line-opacity": {"base": 1, "stops": [[0, 0.4], [5, 1]]} + }, + "interactive": true + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "composite", + "source-layer": "waterway_label", + "minzoom": 12, + "filter": ["in", "class", "canal", "river"], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-max-angle": 30, + "text-size": {"base": 1, "stops": [[13, 12], [18, 16]]}, + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 0.5, + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-color": "hsl(213, 23%, 51%)", + "text-halo-width": 0.5 + }, + "interactive": true + }, + { + "id": "poi-relevant-scalerank4-l15", + "type": "symbol", + "metadata": {"mapbox:group": "1444933456003.5437"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + ["==", "scalerank", 4], + [">=", "localrank", 15], + [ + "in", + "maki", + "amusement-park", + "aquarium", + "attraction", + "bakery", + "bank", + "bar", + "beer", + "bus", + "cafe", + "castle", + "college", + "doctor", + "fast-food", + "ferry", + "fire-station", + "fuel", + "grocery", + "harbor", + "hospital", + "ice-cream", + "lodging", + "marker", + "monument", + "museum", + "pharmacy", + "police", + "post", + "restaurant", + "rocket", + "stadium", + "swimming" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "visibility": "visible", + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-relevant-scalerank4-l1", + "type": "symbol", + "metadata": {"mapbox:group": "1444933456003.5437"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + ["<=", "localrank", 14], + ["==", "scalerank", 4], + [ + "in", + "maki", + "amusement-park", + "aquarium", + "attraction", + "bakery", + "bank", + "bar", + "beer", + "bus", + "cafe", + "castle", + "college", + "doctor", + "fast-food", + "ferry", + "fire-station", + "fuel", + "grocery", + "harbor", + "hospital", + "ice-cream", + "lodging", + "marker", + "monument", + "museum", + "pharmacy", + "police", + "post", + "restaurant", + "rocket", + "stadium", + "swimming" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "visibility": "visible", + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-parks_scalerank4", + "type": "symbol", + "metadata": {"mapbox:group": "1444933456003.5437"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + ["==", "scalerank", 4], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-scalerank3", + "type": "symbol", + "metadata": {"mapbox:group": "1444933372896.5967"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 15, + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + ["==", "scalerank", 3] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 1, + "visibility": "visible", + "text-offset": [0, 0.9], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-parks-scalerank3", + "type": "symbol", + "metadata": {"mapbox:group": "1444933372896.5967"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + ["==", "scalerank", 3], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "visibility": "visible", + "text-offset": [0, 0.9], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "road-label-small", + "type": "symbol", + "metadata": {"mapbox:group": "1444933721429.3076"}, + "source": "composite", + "source-layer": "road_label", + "minzoom": 15, + "filter": [ + "all", + [ + "!in", + "class", + "aerialway", + "link", + "motorway", + "path", + "pedestrian", + "primary", + "secondary", + "street", + "street_limited", + "tertiary", + "trunk" + ], + ["==", "$type", "LineString"] + ], + "layout": { + "text-size": {"base": 1, "stops": [[15, 10], [20, 13]]}, + "text-max-angle": 30, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 0%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "road-label-medium", + "type": "symbol", + "metadata": {"mapbox:group": "1444933721429.3076"}, + "source": "composite", + "source-layer": "road_label", + "minzoom": 11, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "in", + "class", + "aerialway", + "link", + "path", + "pedestrian", + "street", + "street_limited" + ] + ], + "layout": { + "text-size": {"base": 1, "stops": [[11, 9], [20, 14]]}, + "text-max-angle": 30, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 0%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "road-label-large", + "type": "symbol", + "metadata": {"mapbox:group": "1444933721429.3076"}, + "source": "composite", + "source-layer": "road_label", + "filter": [ + "in", + "class", + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + "layout": { + "text-size": {"base": 1, "stops": [[6, 8], [20, 14]]}, + "text-max-angle": 30, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.5, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "road-shields-black", + "type": "symbol", + "metadata": {"mapbox:group": "1444933575858.6992"}, + "source": "composite", + "source-layer": "road_label", + "filter": [ + "all", + [ + "!in", + "shield", + "at-expressway", + "at-motorway", + "at-state-b", + "bg-motorway", + "bg-national", + "ch-main", + "ch-motorway", + "cz-motorway", + "cz-road", + "de-motorway", + "e-road", + "fi-main", + "gr-motorway", + "gr-national", + "hr-motorway", + "hr-state", + "hu-main", + "hu-motorway", + "nz-state", + "pl-expressway", + "pl-motorway", + "pl-national", + "ro-county", + "ro-motorway", + "ro-national", + "rs-motorway", + "rs-state-1b", + "se-main", + "si-expressway", + "si-motorway", + "sk-highway", + "sk-road", + "us-interstate", + "us-interstate-business", + "us-interstate-duplex", + "us-interstate-truck", + "za-metropolitan", + "za-national", + "za-provincial", + "za-regional" + ], + ["<=", "reflen", 6] + ], + "layout": { + "text-size": 9, + "icon-image": "{shield}-{reflen}", + "icon-rotation-alignment": "viewport", + "text-max-angle": 38, + "symbol-spacing": {"base": 1, "stops": [[11, 150], [14, 200]]}, + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "symbol-placement": { + "base": 1, + "stops": [[10, "point"], [11, "line"]] + }, + "text-padding": 2, + "text-rotation-alignment": "viewport", + "text-field": "{ref}", + "text-letter-spacing": 0.05, + "icon-padding": 2 + }, + "paint": { + "text-color": "hsl(230, 21%, 37%)", + "icon-halo-color": "rgba(0, 0, 0, 1)", + "icon-halo-width": 1, + "text-opacity": 1, + "icon-color": "white", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 0 + }, + "interactive": true + }, + { + "id": "road-shields-white", + "type": "symbol", + "metadata": {"mapbox:group": "1444933575858.6992"}, + "source": "composite", + "source-layer": "road_label", + "filter": [ + "all", + ["<=", "reflen", 6], + [ + "in", + "shield", + "at-expressway", + "at-motorway", + "at-state-b", + "bg-motorway", + "bg-national", + "ch-main", + "ch-motorway", + "cz-motorway", + "cz-road", + "de-motorway", + "e-road", + "fi-main", + "gr-motorway", + "gr-national", + "hr-motorway", + "hr-state", + "hu-main", + "hu-motorway", + "nz-state", + "pl-expressway", + "pl-motorway", + "pl-national", + "ro-county", + "ro-motorway", + "ro-national", + "rs-motorway", + "rs-state-1b", + "se-main", + "si-expressway", + "si-motorway", + "sk-highway", + "sk-road", + "us-interstate", + "us-interstate-business", + "us-interstate-duplex", + "us-interstate-truck", + "za-metropolitan", + "za-national", + "za-provincial", + "za-regional" + ] + ], + "layout": { + "text-size": 9, + "icon-image": "{shield}-{reflen}", + "icon-rotation-alignment": "viewport", + "text-max-angle": 38, + "symbol-spacing": {"base": 1, "stops": [[11, 150], [14, 200]]}, + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "symbol-placement": { + "base": 1, + "stops": [[10, "point"], [11, "line"]] + }, + "text-padding": 2, + "text-rotation-alignment": "viewport", + "text-field": "{ref}", + "text-letter-spacing": 0.05, + "icon-padding": 2 + }, + "paint": { + "text-color": "hsl(0, 0%, 100%)", + "icon-halo-color": "rgba(0, 0, 0, 1)", + "icon-halo-width": 1, + "text-opacity": 1, + "icon-color": "white", + "text-halo-color": "hsl(0, 0%, 59%)" + }, + "interactive": true + }, + { + "id": "motorway-junction", + "type": "symbol", + "metadata": {"mapbox:group": "1444933575858.6992"}, + "source": "composite", + "source-layer": "motorway_junction", + "minzoom": 14, + "filter": [">", "reflen", 0], + "layout": { + "text-field": "{ref}", + "text-size": 9, + "icon-image": "motorway-exit-{reflen}", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"] + }, + "paint": { + "text-color": "hsl(0, 0%, 100%)", + "text-translate": [0, 0] + }, + "interactive": true + }, + { + "id": "laavut-kodat", + "type": "symbol", + "source": "composite", + "source-layer": "Laavut-kodat", + "minzoom": 12, + "layout": { + "visibility": "visible", + "text-field": "{name}", + "icon-image": "campsite-11", + "text-offset": [0, 0.9], + "text-size": 11, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-anchor": "top" + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-opacity": {"base": 1, "stops": [[11, 0], [11.25, 1]]}, + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-outdoor-features", + "type": "symbol", + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "in", + "maki", + "bicycle", + "bicycle-share", + "drinking-water", + "information", + "picnic-site", + "toilet" + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[13, 10], [20, 13]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "mountain-peak-label", + "type": "symbol", + "source": "composite", + "source-layer": "mountain_peak_label", + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": "{maki}-15", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-offset": [0, 0.8], + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "mountain-peak-label-with-elevation", + "type": "symbol", + "source": "composite", + "source-layer": "mountain_peak_label", + "filter": [">", "elevation_m", 0], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": "{maki}-15", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-offset": [0, 0.8], + "text-anchor": "top", + "text-field": "{name_en}, {elevation_m}m", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-scalerank2", + "type": "symbol", + "metadata": {"mapbox:group": "1444933358918.2366"}, + "source": "composite", + "source-layer": "poi_label", + "minzoom": 13, + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + ["==", "scalerank", 2] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[14, 10], [20, 14]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "text-transform": "none", + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "visibility": "visible", + "text-offset": [0, 0.65], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "poi-parks-scalerank2", + "type": "symbol", + "metadata": {"mapbox:group": "1444933358918.2366"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + ["==", "scalerank", 2], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[14, 10], [20, 14]]}, + "icon-image": {"stops": [[14, "{maki}-11"], [15, "{maki}-15"]]}, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 1], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#434019", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "rail-label", + "type": "symbol", + "source": "composite", + "source-layer": "rail_station_label", + "minzoom": 12, + "filter": ["!=", "maki", "entrance"], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[16, 11], [20, 13]]}, + "icon-image": "{network}", + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-offset": [0, 1.2], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": { + "base": 1, + "stops": [[0, ""], [13, "{name_en}"]] + }, + "text-letter-spacing": 0.01, + "icon-padding": 0, + "text-max-width": 7 + }, + "paint": { + "text-color": "#434019", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 0.5, + "icon-halo-width": 4, + "icon-halo-color": "#fff", + "text-opacity": {"base": 1, "stops": [[13.99, 0], [14, 1]]}, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "water-label-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444933808272.805"}, + "source": "composite", + "source-layer": "water_label", + "minzoom": 15, + "filter": ["<=", "area", 10000], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-max-width": 7, + "text-size": {"base": 1, "stops": [[16, 13], [20, 16]]} + }, + "paint": {"text-color": "#657f9f"}, + "interactive": true + }, + { + "id": "water-label", + "type": "symbol", + "metadata": {"mapbox:group": "1444933808272.805"}, + "source": "composite", + "source-layer": "water_label", + "minzoom": 5, + "filter": [">", "area", 10000], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-max-width": 7, + "text-size": {"base": 1, "stops": [[13, 13], [18, 18]]} + }, + "paint": { + "text-color": "hsl(213, 27%, 55%)", + "text-halo-color": "hsla(0, 0%, 100%, 0)", + "text-halo-width": 0 + }, + "interactive": true + }, + { + "id": "poi-parks-scalerank1", + "type": "symbol", + "metadata": {"mapbox:group": "1444933322393.2852"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + ["<=", "scalerank", 1], + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": {"stops": [[13, "{maki}-11"], [14, "{maki}-15"]]}, + "text-max-angle": 38, + "text-transform": "none", + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0.9], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-blur": 0.5, + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "poi-scalerank1", + "type": "symbol", + "metadata": {"mapbox:group": "1444933322393.2852"}, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + ["<=", "scalerank", 1] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 10], [18, 14]]}, + "icon-image": "{maki}-11", + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "visibility": "visible", + "text-offset": [0, 0.7], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(56, 46%, 18%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "airport-label", + "type": "symbol", + "source": "composite", + "source-layer": "airport_label", + "minzoom": 9, + "filter": ["<=", "scalerank", 2], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[10, 12], [18, 18]]}, + "icon-image": {"stops": [[12, "{maki}-11"], [13, "{maki}-15"]]}, + "symbol-spacing": 250, + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0.75], + "text-rotation-alignment": "viewport", + "text-anchor": "top", + "text-field": {"stops": [[11, "{ref}"], [12, "{name_en}"]]}, + "text-letter-spacing": 0.01, + "text-max-width": 9 + }, + "paint": { + "text-color": "#434019", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "place-islet-archipelago-aboriginal", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": [ + "in", + "type", + "aboriginal_lands", + "archipelago", + "islet" + ], + "layout": { + "text-line-height": 1.2, + "text-size": {"base": 1, "stops": [[10, 11], [18, 16]]}, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0], + "text-rotation-alignment": "viewport", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "place-neighbourhood", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": ["==", "type", "neighbourhood"], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[12, 8.5], [16, 14]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 3, + "visibility": "visible", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 7 + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-color": "#6a6b5e", + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "place-suburb", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": ["==", "type", "suburb"], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[11, 8.5], [15, 15]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Regular"], + "text-padding": 3, + "visibility": "visible", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 7 + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-color": "hsl(63, 6%, 39%)", + "text-halo-blur": 0 + }, + "interactive": true + }, + { + "id": "place-hamlet", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": ["==", "type", "hamlet"], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[12, 11.5], [15, 16]]} + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.5, + "text-color": "#232216", + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "place-village", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 8, + "maxzoom": 15, + "filter": ["==", "type", "village"], + "layout": { + "text-field": "{name_en}", + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-max-width": 7, + "text-size": {"base": 1, "stops": [[10, 11.5], [16, 18]]} + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-blur": 0.5, + "text-color": "#232216", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "place-town", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 6, + "maxzoom": 15, + "filter": ["==", "type", "town"], + "layout": { + "text-size": {"base": 1, "stops": [[7, 11.5], [15, 20]]}, + "text-font": { + "base": 1, + "stops": [ + [11, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [12, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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-image": "dot-9" + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1.25, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 0.5 + }, + "interactive": true + }, + { + "id": "place-island", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": ["==", "type", "island"], + "layout": { + "text-line-height": 1.2, + "text-size": {"base": 1, "stops": [[10, 11], [18, 16]]}, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": ["Open Sans Regular", "Arial Unicode MS Regular"], + "text-padding": 2, + "text-offset": [0, 0], + "text-rotation-alignment": "viewport", + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(56, 23%, 20%)", + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "place-city-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + ["!in", "scalerank", 0, 1, 2, 3, 4, 5], + ["==", "type", "city"] + ], + "layout": { + "text-size": {"base": 1, "stops": [[6, 12], [14, 22]]}, + "icon-image": "dot-9", + "text-font": { + "base": 1, + "stops": [ + [7, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [8, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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 + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.25, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]} + }, + "interactive": true + }, + { + "id": "place-city-md-s", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + ["==", "type", "city"], + ["in", "ldir", "E", "S", "SE", "SW"], + ["in", "scalerank", 3, 4, 5] + ], + "layout": { + "text-field": "{name_en}", + "icon-image": "dot-10", + "text-anchor": { + "base": 1, + "stops": [[7, "top"], [8, "center"]] + }, + "text-offset": { + "base": 1, + "stops": [[7.99, [0, 0.1]], [8, [0, 0]]] + }, + "text-font": { + "base": 1, + "stops": [ + [7, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [8, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 0.9, "stops": [[5, 12], [12, 22]]} + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": "hsl(43, 100%, 97%)", + "text-color": "#232216", + "text-halo-blur": 1, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]} + }, + "interactive": true + }, + { + "id": "place-city-md-n", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + ["==", "type", "city"], + ["in", "ldir", "N", "NE", "NW", "W"], + ["in", "scalerank", 3, 4, 5] + ], + "layout": { + "icon-image": "dot-10", + "text-font": { + "base": 1, + "stops": [ + [7, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [8, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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, + "text-size": {"base": 0.9, "stops": [[5, 12], [12, 22]]} + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.5, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "place-city-lg-s", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + ["<=", "scalerank", 2], + ["==", "type", "city"], + ["in", "ldir", "E", "S", "SE", "SW"] + ], + "layout": { + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [6, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [7, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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, + "text-size": {"base": 0.9, "stops": [[4, 12], [10, 24]]} + }, + "paint": { + "text-color": "#232216", + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.5, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "place-city-lg-n", + "type": "symbol", + "metadata": {"mapbox:group": "1444862510685.128"}, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + ["<=", "scalerank", 2], + ["==", "type", "city"], + ["in", "ldir", "N", "NE", "NW", "W"] + ], + "layout": { + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [6, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [7, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "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, + "text-size": {"base": 0.9, "stops": [[4, 12], [10, 22]]} + }, + "paint": { + "text-color": "#232216", + "text-opacity": 1, + "text-halo-color": "hsl(43, 100%, 97%)", + "text-halo-width": 1.5, + "icon-opacity": {"base": 1, "stops": [[7.99, 1], [8, 0]]}, + "text-halo-blur": 1 + }, + "interactive": true + }, + { + "id": "marine-label-sm-ln", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": [ + "all", + ["==", "$type", "LineString"], + [">=", "labelrank", 4] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1, "stops": [[3, 12], [6, 16]]}, + "symbol-spacing": {"base": 1, "stops": [[4, 100], [6, 400]]}, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.1, + "text-max-width": 5 + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-sm-pt", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": ["all", ["==", "$type", "Point"], [">=", "labelrank", 4]], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.1, + "text-line-height": 1.5, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[3, 12], [6, 16]]} + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-md-ln", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["in", "labelrank", 2, 3] + ], + "layout": { + "text-line-height": 1.1, + "text-size": {"base": 1.1, "stops": [[2, 12], [5, 20]]}, + "symbol-spacing": 250, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-md-pt", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + ["==", "$type", "Point"], + ["in", "labelrank", 2, 3] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.15, + "text-line-height": 1.5, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1.1, "stops": [[2, 14], [5, 20]]} + }, + "paint": {"text-color": "hsl(213, 24%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-lg-ln", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "labelrank", 1] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.1, + "symbol-placement": "line", + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[1, 14], [4, 30]]} + }, + "paint": {"text-color": "hsl(213, 27%, 67%)"}, + "interactive": true + }, + { + "id": "marine-label-lg-pt", + "type": "symbol", + "metadata": {"mapbox:group": "1444856087950.3635"}, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": ["all", ["==", "$type", "Point"], ["==", "labelrank", 1]], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.5, + "text-font": ["Open Sans Italic", "Arial Unicode MS Regular"], + "text-size": {"base": 1, "stops": [[1, 14], [4, 30]]} + }, + "paint": {"text-color": "#abbbcf"}, + "interactive": true + }, + { + "id": "state-label-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444856151690.9143"}, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 8, + "filter": ["<", "area", 20000], + "layout": { + "text-size": {"base": 1, "stops": [[6, 10], [9, 14]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "text-field": { + "base": 1, + "stops": [[0, "{abbr}"], [6, "{name_en}"]] + }, + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(49, 20%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "state-label-md", + "type": "symbol", + "metadata": {"mapbox:group": "1444856151690.9143"}, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 8, + "filter": ["all", ["<", "area", 80000], [">=", "area", 20000]], + "layout": { + "text-size": {"base": 1, "stops": [[5, 10], [8, 16]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "text-field": { + "base": 1, + "stops": [[0, "{abbr}"], [5, "{name_en}"]] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(49, 20%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "state-label-lg", + "type": "symbol", + "metadata": {"mapbox:group": "1444856151690.9143"}, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 7, + "filter": [">=", "area", 80000], + "layout": { + "text-size": {"base": 1, "stops": [[4, 10], [7, 18]]}, + "text-transform": "uppercase", + "text-font": ["Open Sans Bold", "Arial Unicode MS Bold"], + "text-padding": 1, + "text-field": { + "base": 1, + "stops": [[0, "{abbr}"], [4, "{name_en}"]] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(49, 20%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.5)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "country-label-sm", + "type": "symbol", + "metadata": {"mapbox:group": "1444856144497.7825"}, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 10, + "filter": [">=", "scalerank", 5], + "layout": { + "text-field": "{name_en}", + "text-max-width": 6, + "text-font": { + "base": 1, + "stops": [ + [0, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [5, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 0.9, "stops": [[5, 14], [9, 22]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(50, 45%, 16%)", + "text-halo-color": "hsl(36, 75%, 96%)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "country-label-md", + "type": "symbol", + "metadata": {"mapbox:group": "1444856144497.7825"}, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 8, + "filter": ["in", "scalerank", 3, 4], + "layout": { + "text-field": { + "base": 1, + "stops": [[0, "{code}"], [2, "{name_en}"]] + }, + "text-max-width": 6, + "text-font": { + "base": 1, + "stops": [ + [0, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [5, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 1, "stops": [[3, 10], [8, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(50, 45%, 16%)", + "text-halo-color": "hsl(36, 75%, 96%)", + "text-halo-width": 1 + }, + "interactive": true + }, + { + "id": "country-label-lg", + "type": "symbol", + "metadata": {"mapbox:group": "1444856144497.7825"}, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 7, + "filter": ["in", "scalerank", 1, 2], + "layout": { + "text-field": "{name_en}", + "text-max-width": {"base": 1, "stops": [[0, 5], [3, 6]]}, + "text-font": { + "base": 1, + "stops": [ + [0, ["Open Sans Regular", "Arial Unicode MS Regular"]], + [5, ["Open Sans Semibold", "Arial Unicode MS Regular"]] + ] + }, + "text-size": {"base": 1, "stops": [[1, 10], [6, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(50, 45%, 16%)", + "text-halo-color": "hsl(36, 75%, 96%)", + "text-halo-width": 1 + }, + "interactive": true + } + ], + "created": "2016-07-15T11:48:31.825Z", + "id": "ciqnol3nm002fc5lvsyci972q", + "modified": "2018-11-21T17:07:08.359Z", + "owner": "asdigital", + "visibility": "private", + "draft": false +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivity.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivity.kt index 3d9bc09c6d..4dd68294e3 100644 --- a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivity.kt +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivity.kt @@ -1,59 +1,152 @@ -package com.mapbox.mapboxsdk.wearapp +package com.example.mapbox +import android.annotation.SuppressLint +import android.location.Location import android.os.Bundle +import android.os.SystemClock +import android.support.constraint.ConstraintLayout import android.support.wearable.activity.WearableActivity +import android.util.Log +import android.widget.Toast +import androidx.lifecycle.Observer +import com.example.mapbox.ui.MapboxMapView +import com.example.mapbox.ui.extensions.addViewAndMatchItToParent +import com.mapbox.android.core.permissions.PermissionsListener +import com.mapbox.android.core.permissions.PermissionsManager import com.mapbox.mapboxsdk.Mapbox -import com.mapbox.mapboxsdk.maps.Style -import kotlinx.android.synthetic.main.activity_main.* - -class MainActivity : WearableActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Mapbox.getInstance(this, "INSERT ACCESSTOKEN") - setContentView(R.layout.activity_main) - - // Enables Always-on - setAmbientEnabled() - mapView.onCreate(savedInstanceState) - mapView.getMapAsync{ - it.setStyle(Style.MAPBOX_STREETS) - } - } - - override fun onStart() { - super.onStart() - mapView.onStart() - } - - override fun onResume() { - super.onResume() - mapView.onResume() - } - - override fun onPause() { - super.onPause() - mapView.onPause() - } - - override fun onStop() { - super.onStop() - mapView.onStop() - } - - override fun onLowMemory() { - super.onLowMemory() - mapView.onLowMemory() - } - - override fun onDestroy() { - super.onDestroy() - mapView.onDestroy() - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) - } +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback +import com.soy.android.maps.compass.WassCompassEngine +import com.soy.android.maps.livedata.MapViewSensors +import dagger.android.AndroidInjection +import javax.inject.Inject +class MainActivity : WearableActivity(), PermissionsListener, OnMapReadyCallback { + override fun onMapReady(mapboxMap: MapboxMap) { + measureAndPrintTimeMillis("onStart.requestSensorUpdates") { + requestSensorUpdates() + } + mapboxMapView.onMapReady(mapboxMap) + } + + private lateinit var mapboxMapView: MapboxMapView + + @Inject + lateinit var sensors: MapViewSensors + + @SuppressLint("MissingPermission") + override fun onCreate(savedInstanceState: Bundle?) { + AndroidInjection.inject(this) + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + if (PermissionsManager.areLocationPermissionsGranted(this)) { + createMapboxMapView() + } else { + PermissionsManager(this).requestLocationPermissions(this) + } + setAmbientEnabled() + } + + private fun createMapboxMapView() { + Mapbox.getInstance(this, getString(R.string.mapbox_api_key)) + val location = sensors.locationLiveData.value + val root = findViewById<ConstraintLayout>(R.id.content) + mapboxMapView = MapboxMapView(this, location).apply { + compassEngine = WassCompassEngine(sensors.headingLiveData) + root.addViewAndMatchItToParent(this) + onCreate(null) + getMapAsync(this@MainActivity) + } + } + + public override fun onResume() { + super.onResume() + measureAndPrintTimeMillis("onResume") { + mapboxMapView.onResume() + } + } + + public override fun onPause() { + super.onPause() + measureAndPrintTimeMillis("onPause") { + mapboxMapView.onPause() + } + } + + override fun onLowMemory() { + super.onLowMemory() + measureAndPrintTimeMillis("onLowMemory") { + mapboxMapView.onLowMemory() + } + } + + override fun onStart() { + super.onStart() + measureAndPrintTimeMillis("onStart.mapOnStart") { + mapboxMapView.onStart() + } + } + + override fun onStop() { + super.onStop() + removeSensorUpdates() + measureAndPrintTimeMillis("onStop") { + mapboxMapView.onStop() + } + } + + override fun onDestroy() { + super.onDestroy() + measureAndPrintTimeMillis("onDestroy") { + mapboxMapView.onDestroy() + } + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + measureAndPrintTimeMillis("onSaveInstanceState") { + mapboxMapView.onSaveInstanceState(outState) + } + } + + private fun requestSensorUpdates() { + sensors.requestUpdates(locationObserver) + mapboxMapView.compassEngine?.requestUpdates() + } + + private fun removeSensorUpdates() { + sensors.removeUpdates(locationObserver) + mapboxMapView.compassEngine?.removeUpdates() + } + + // Sensors + private val locationObserver: Observer<Location> = Observer { location -> + measureAndPrintTimeMillis("onNewLocation") { + mapboxMapView.onNewLocation(location) + } + } + + override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) { + Toast.makeText(this, R.string.user_location_permission_explanation, Toast.LENGTH_LONG).show() + } + + override fun onPermissionResult(granted: Boolean) { + if (granted) { + createMapboxMapView() + } else { + Toast.makeText(this, R.string.user_location_permission_not_granted, Toast.LENGTH_LONG).show() + } + } +} + +/** + * Executes the given [block] and returns elapsed time in milliseconds. + */ +public inline fun <T> measureAndPrintTimeMillis(blockName: String, block: () -> T): T { + val start = SystemClock.elapsedRealtime() + val t = block() + val elapsedTime = SystemClock.elapsedRealtime() - start + Log.d("MapExample", "It took $elapsedTime ms to run [$blockName]") + return t } + diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivityModule.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivityModule.kt new file mode 100644 index 0000000000..eec66ebee3 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MainActivityModule.kt @@ -0,0 +1,10 @@ +package com.example.mapbox + +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class MainActivityModule { + @ContributesAndroidInjector + internal abstract fun mainActivity(): MainActivity +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MapboxApp.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MapboxApp.kt new file mode 100644 index 0000000000..ded4931802 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/MapboxApp.kt @@ -0,0 +1,16 @@ +package com.example.mapbox + +import dagger.android.AndroidInjector +import dagger.android.DaggerApplication + +class MapboxApp : DaggerApplication() { + private val appComponent: AndroidInjector<MapboxApp> by lazy { + DaggerAppComponent + .builder() + .create(this) + } + + override fun applicationInjector(): AndroidInjector<out DaggerApplication> { + return appComponent + } +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/breadcrumb/Breadcrumb.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/breadcrumb/Breadcrumb.kt new file mode 100644 index 0000000000..af27cc36b6 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/breadcrumb/Breadcrumb.kt @@ -0,0 +1,157 @@ +package com.soy.android.maps.breadcrumb + +import android.content.res.Resources +import com.example.mapbox.breadcrumb.ExerciseEngineState +import com.example.mapbox.ui.MapboxMapView +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.location.OnLocationStaleListener +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.Style +import com.mapbox.mapboxsdk.plugins.annotation.Line +import com.mapbox.mapboxsdk.plugins.annotation.LineManager +import com.mapbox.mapboxsdk.plugins.annotation.SymbolManager +import timber.log.Timber + +/** + * Note that this is not public API and taken from [com.mapbox.mapboxsdk.location.LocationComponentConstants]. Needed + * to be hardcoded to have the line layer below the location indicator + */ +private const val LOCATION_INDICATOR_BACKGROUND_LAYER_ID = "mapbox-location-stroke-layer" + +class Breadcrumb( + mapView: MapboxMapView, + private val map: MapboxMap, + style: Style +) : OnLocationStaleListener { + + private val lineManager: LineManager = LineManager(mapView, map, style, LOCATION_INDICATOR_BACKGROUND_LAYER_ID) + private val symbolManager: SymbolManager = SymbolManager(mapView, map, style, LOCATION_INDICATOR_BACKGROUND_LAYER_ID) + private val resources: Resources + + init { + map.locationComponent.addOnLocationStaleListener(this) + resources = mapView.resources + } + + /** + * Flag that represents whether start symbol is created + */ + private var startSymbolCreated = false + + /** + * Holds [LatLng] list of current recording state line. A recording state line is the line which holds the list of + * [LatLng] recorded during [Recording] state. When state is [Paused] last recording state line does not receive + * updates and when the state is [Recording] after [Paused] state a new line is created and that line is updated + * according to [currentRecordingStateLatLngs] + */ + private var currentRecordingStateLatLngs = mutableListOf<LatLng>() + + /** + * A recording state line is the line which is created and updated during [Recording] state. + * + * When state is [Paused] last recording state line does not receive updates. + * + * [currentRecordingStateLine] is the line which is created either at the beginning of the exercise or when the + * state is [Recording] again after last [Paused] state. + */ + private var currentRecordingStateLine: Line? = null + + /** + * The [ExerciseEngineState] which belongs to the previous [com.soy.android.maps.livedata.StatefulLocation] + */ + private var previousExerciseEngineState: ExerciseEngineState? = null + + private var fromStaleState = false + + private var isMapViewVisible = true + + internal fun onNewLocation(latLng: LatLng, exerciseEngineState: ExerciseEngineState?) { + if (!startSymbolCreated) { + // We create a start symbol when the exercise is started + symbolManager.addStartExerciseSymbol(latLng) + startSymbolCreated = true + previousExerciseEngineState = exerciseEngineState + return + } + when { + exerciseRecording(exerciseEngineState) -> { + if (fromStaleState) { + fromStaleState = false + map.locationComponent.addOnLocationStaleListener(this) + lineManager.createStaleStateLine(listOf(currentRecordingStateLatLngs.last(), latLng)) + // clear the recording state latlng list and add the start point for the new line + currentRecordingStateLatLngs.clear() + currentRecordingStateLatLngs.add(latLng) + } else { + currentRecordingStateLatLngs.add(latLng) + createOrUpdateRecordingLine() + } + } + exercisePaused(exerciseEngineState) -> { + // add the end point for currentRecordingStateLine + currentRecordingStateLatLngs.add(latLng) + createOrUpdateRecordingLine() + // add the start point of the pause line + } + exerciseResumed(exerciseEngineState) -> { + // add the end point of the pause line + // create the pause line + lineManager.createPausedStateLine(listOf(currentRecordingStateLatLngs.last(), latLng)) + Timber.d("Pause state line is created") + // after we create the pause line we clear pauseLinePoints for next possible pause line + // clear the recording state latlng list and add the start point for the new line + currentRecordingStateLatLngs.clear() + currentRecordingStateLatLngs.add(latLng) + createOrUpdateRecordingLine() + } + } + previousExerciseEngineState = exerciseEngineState + } + + private fun createOrUpdateRecordingLine() { + currentRecordingStateLine?.let { + // we update the latlng list for currentRecordingStateLine + it.latLngs = currentRecordingStateLatLngs + // We update the currentRecordingStateLine only when the mapview is visible + if (isMapViewVisible) { + lineManager.update(it) + Timber.d("Recording state line is updated") + } + } ?: run { + if (currentRecordingStateLatLngs.size > 1) { + Timber.d("Recording state line is created") + currentRecordingStateLine = lineManager.createRecordingStateLine(currentRecordingStateLatLngs) + } + } + } + + private fun exerciseResumed(exerciseEngineState: ExerciseEngineState?) = + previousExerciseEngineState == ExerciseEngineState.Paused && exerciseEngineState == ExerciseEngineState.Recording + + private fun exercisePaused(exerciseEngineState: ExerciseEngineState?) = + previousExerciseEngineState == ExerciseEngineState.Recording && exerciseEngineState == ExerciseEngineState.Paused + + private fun exerciseRecording(exerciseEngineState: ExerciseEngineState?) = + previousExerciseEngineState == ExerciseEngineState.Recording && exerciseEngineState == ExerciseEngineState.Recording + + internal fun onDestroy() { + lineManager.onDestroy() + symbolManager.onDestroy() + } + + internal fun onResume() { + isMapViewVisible = true + createOrUpdateRecordingLine() + } + + internal fun onStop() { + isMapViewVisible = false + } + + override fun onStaleStateChange(isStale: Boolean) { + if (isStale) { + map.locationComponent.removeOnLocationStaleListener(this) + fromStaleState = isStale + } + } +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/breadcrumb/ExerciseEngineState.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/breadcrumb/ExerciseEngineState.kt new file mode 100644 index 0000000000..1d78bb7035 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/breadcrumb/ExerciseEngineState.kt @@ -0,0 +1,6 @@ +package com.example.mapbox.breadcrumb + +enum class ExerciseEngineState { + Paused, + Recording +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/compass/WassCompassEngine.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/compass/WassCompassEngine.kt new file mode 100644 index 0000000000..6795ea68c4 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/compass/WassCompassEngine.kt @@ -0,0 +1,48 @@ +package com.soy.android.maps.compass + +import android.hardware.SensorManager.SENSOR_STATUS_ACCURACY_HIGH +import androidx.lifecycle.Observer +import com.example.mapbox.livedata.HeadingSensorLiveData +import com.mapbox.mapboxsdk.location.CompassEngine +import com.mapbox.mapboxsdk.location.CompassListener + +class WassCompassEngine( + private val headingSensorLiveData: HeadingSensorLiveData? +) : CompassEngine { + + private val compassListeners = mutableListOf<CompassListener>() + + private var lastHeading: Float = 0.0f + + private val headingObserver: Observer<Float> = Observer { + lastHeading = Math.toDegrees(it.toDouble()).toFloat() + notifyCompassChangeListeners(lastHeading) + } + + /** + * Always returns [SENSOR_STATUS_ACCURACY_HIGH] and should not mean anything in this context + */ + override fun getLastAccuracySensorStatus() = SENSOR_STATUS_ACCURACY_HIGH + + override fun addCompassListener(compassListener: CompassListener) { + compassListeners.add(compassListener) + } + + override fun removeCompassListener(compassListener: CompassListener) { + compassListeners.remove(compassListener) + } + + override fun getLastHeading() = lastHeading + + fun requestUpdates() = headingSensorLiveData?.observeForever(headingObserver) + + fun removeUpdates() = headingSensorLiveData?.removeObserver(headingObserver) + + private fun notifyCompassChangeListeners(heading: Float) { + lastHeading = heading.apply { + for (compassListener in compassListeners) { + compassListener.onCompassChanged(this) + } + } + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/di/AppComponent.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/di/AppComponent.kt new file mode 100644 index 0000000000..039ca746c0 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/di/AppComponent.kt @@ -0,0 +1,19 @@ +import com.example.mapbox.MainActivityModule +import com.example.mapbox.MapboxApp +import dagger.Component +import dagger.android.AndroidInjector +import dagger.android.support.AndroidSupportInjectionModule +import javax.inject.Singleton + +/** + * Application component refers to application level modules only + */ +@Singleton +@Component(modules = [ + AndroidSupportInjectionModule::class, + MainActivityModule::class +]) +interface AppComponent : AndroidInjector<MapboxApp> { + @Component.Builder + abstract class Builder : AndroidInjector.Builder<MapboxApp>() +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/AnnotationsExtensions.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/AnnotationsExtensions.kt new file mode 100644 index 0000000000..be4f09d9ff --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/AnnotationsExtensions.kt @@ -0,0 +1,48 @@ +package com.soy.android.maps.breadcrumb + +import com.example.mapbox.ui.PAUSE_LINE_PATTERN +import com.example.mapbox.ui.START_SYMBOL_ICON_ID +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.plugins.annotation.* +import com.mapbox.mapboxsdk.style.layers.Property + +private const val MAP_LINE_WIDTH = 4f // In pixels +private const val COLOR_MAP_LINE_REGULAR = "#FF5640" +private const val COLOR_MAP_LINE_PAUSE = "#00000000" +private const val MAP_LINE_PAUSE_OPACITY = 0.2f + +internal fun SymbolManager.addStartExerciseSymbol(latLng: LatLng) { + val option = SymbolOptions() + .withLatLng(latLng) + .withIconImage(START_SYMBOL_ICON_ID) + this.create(option) +} + +internal fun LineManager.createRecordingStateLine(recordingStateLatLngs: List<LatLng>): Line { + lineCap = Property.LINE_CAP_BUTT + val lineOptions = LineOptions() + .withLatLngs(recordingStateLatLngs) + .withLineJoin(Property.LINE_JOIN_ROUND) + .withLineColor(COLOR_MAP_LINE_REGULAR) + .withLineWidth(MAP_LINE_WIDTH) + return this.create(lineOptions) +} + +internal fun LineManager.createPausedStateLine(startEndPoints: List<LatLng>): Line { + val lineOptions = LineOptions() + .withLatLngs(startEndPoints) + .withLineJoin(Property.LINE_JOIN_ROUND) + .withLineColor(COLOR_MAP_LINE_PAUSE) + .withLineWidth(MAP_LINE_WIDTH) + .withLinePattern(PAUSE_LINE_PATTERN) + return this.create(lineOptions) +} + +internal fun LineManager.createStaleStateLine(startEndPoints: List<LatLng>): Line { + val lineOptions = LineOptions() + .withLatLngs(startEndPoints) + .withLineJoin(Property.LINE_JOIN_ROUND) + .withLineColor(COLOR_MAP_LINE_REGULAR) + .withLineWidth(MAP_LINE_WIDTH) + return this.create(lineOptions) +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/LocationExtensions.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/LocationExtensions.kt new file mode 100644 index 0000000000..67bebf7504 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/LocationExtensions.kt @@ -0,0 +1,8 @@ +package com.example.mapbox.extensions + +import android.location.Location +import com.mapbox.mapboxsdk.geometry.LatLng + +fun Location.latLong(): LatLng { + return LatLng(latitude, longitude) +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/MapboxMapExtensions.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/MapboxMapExtensions.kt new file mode 100644 index 0000000000..eb863f9f64 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/MapboxMapExtensions.kt @@ -0,0 +1,22 @@ +package com.soy.android.maps.extensions + +import com.mapbox.mapboxsdk.location.modes.CameraMode +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.Style +import kotlinx.coroutines.suspendCancellableCoroutine +import timber.log.Timber +import kotlin.coroutines.resume + +fun MapboxMap.isCameraInTrackingMode() = getActivatedLocationComponent()?.run { + cameraMode == CameraMode.TRACKING_COMPASS || + cameraMode == CameraMode.TRACKING || + cameraMode == CameraMode.TRACKING_GPS || + cameraMode == CameraMode.TRACKING_GPS_NORTH +} + +fun MapboxMap.getActivatedLocationComponent() = locationComponent.takeIf { + it.isLocationComponentEnabled +} ?: run { + Timber.w("Calling location component, but it is not enabled.") + null +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/ResourceExtensions.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/ResourceExtensions.kt new file mode 100644 index 0000000000..785ed32840 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/extensions/ResourceExtensions.kt @@ -0,0 +1,25 @@ +package com.example.mapbox.extensions + +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import androidx.annotation.DrawableRes + +fun Resources.getBitmapFromDrawable(@DrawableRes drawableResId: Int): Bitmap { + return getDrawable(drawableResId, null).getBitmapFromDrawable() +} + +fun Drawable.getBitmapFromDrawable(): Bitmap { + return if (this is BitmapDrawable) { + bitmap + } else { + val bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888) + Canvas(bitmap).let { + setBounds(0, 0, it.width, it.height) + draw(it) + bitmap + } + } +}
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/HeadingSensorLiveData.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/HeadingSensorLiveData.kt new file mode 100644 index 0000000000..4acbfb754a --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/HeadingSensorLiveData.kt @@ -0,0 +1,33 @@ +package com.example.mapbox.livedata + +import androidx.lifecycle.LiveData +import com.example.mapbox.mockdata.MockHeadingSensor +import kotlinx.coroutines.* +import javax.inject.Inject + +private const val GPS_FIX_INTERVAL_MILLISEC = 1000L + +class HeadingSensorLiveData @Inject constructor( + private val mockHeadingSensor: MockHeadingSensor +) : LiveData<Float>() { + + private val job = Job() + private val backgroundScope = CoroutineScope(Dispatchers.Default + job) + + override fun onActive() { + super.onActive() + backgroundScope.launch { + while(true) { + delay(GPS_FIX_INTERVAL_MILLISEC) + withContext(Dispatchers.Main) { + value = mockHeadingSensor.generateNextValue() + } + } + } + } + + override fun onInactive() { + job.cancel() + super.onInactive() + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/LocationSensorLiveData.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/LocationSensorLiveData.kt new file mode 100644 index 0000000000..c58f9d39e9 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/LocationSensorLiveData.kt @@ -0,0 +1,35 @@ +package com.soy.android.maps.livedata + +import android.location.Location +import androidx.lifecycle.LiveData +import com.asoy.wass.sdk.android.sensor.MockLocationSensor +import kotlinx.coroutines.* +import javax.inject.Inject + +private const val HEADING_INTERVAL_MILLISEC = 500L + +class LocationSensorLiveData +@Inject constructor( + private val mockLocationSensor: MockLocationSensor +) : LiveData<Location>() { + + private val job = Job() + private val backgroundScope = CoroutineScope(Dispatchers.Default + job) + + override fun onActive() { + super.onActive() + backgroundScope.launch { + while (true) { + delay(HEADING_INTERVAL_MILLISEC) + withContext(Dispatchers.Main) { + value = mockLocationSensor.generateNextValue() + } + } + } + } + + override fun onInactive() { + job.cancel() + super.onInactive() + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/LocationWithHeadingLiveData.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/LocationWithHeadingLiveData.kt new file mode 100644 index 0000000000..2d09e9bfd5 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/LocationWithHeadingLiveData.kt @@ -0,0 +1,30 @@ +package com.example.mapbox.livedata + +import android.location.Location +import androidx.lifecycle.MediatorLiveData +import com.soy.android.maps.livedata.LocationSensorLiveData +import javax.inject.Inject + +/** + * [MediatorLiveData] wrapper used to expose the [AndroidLocation]. + * + * The value is mediated based on the last recorded values of [LocationSensorLiveData] + * and [HeadingSensorLiveData], and each time [LocationSensorLiveData] emits a value + * a new [AndroidLocation] value is emitted by this mediator live data. Note that if + */ +class LocationWithHeadingLiveData +@Inject constructor( + headingSensorLiveData: HeadingSensorLiveData, + locationSensorLiveData: LocationSensorLiveData +) : MediatorLiveData<Location>() { + init { + addSource(locationSensorLiveData) { + headingSensorLiveData.value?.let {heading -> + // Convert radian to degree + it.bearing = Math.toDegrees(heading.toDouble()).toFloat() + value = it + } + } + addSource(headingSensorLiveData) {} + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/MapViewSensors.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/MapViewSensors.kt new file mode 100644 index 0000000000..8b56fff3f6 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/livedata/MapViewSensors.kt @@ -0,0 +1,37 @@ +package com.soy.android.maps.livedata + +import android.location.Location +import androidx.lifecycle.Observer +import com.example.mapbox.livedata.HeadingSensorLiveData +import com.example.mapbox.livedata.LocationWithHeadingLiveData +import javax.inject.Inject + +class MapViewSensors +@Inject constructor( + val locationLiveData: LocationWithHeadingLiveData, + val headingLiveData: HeadingSensorLiveData +) { + fun requestUpdates( + locationObserver: Observer<Location>? = null, + headingObserver: Observer<Float>? = null + ) { + locationObserver?.let { + locationLiveData.observeForever(it) + } + headingObserver?.let { + headingLiveData.observeForever(it) + } + } + + fun removeUpdates( + locationObserver: Observer<Location>? = null, + headingObserver: Observer<Float>? = null + ) { + locationObserver?.let { + locationLiveData.removeObserver(it) + } + headingObserver?.let { + headingLiveData.removeObserver(it) + } + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockHeadingSensor.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockHeadingSensor.kt new file mode 100644 index 0000000000..9029d89f29 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockHeadingSensor.kt @@ -0,0 +1,18 @@ +package com.example.mapbox.mockdata + +import javax.inject.Inject + +class MockHeadingSensor +@Inject constructor() { + + private var heading: Float = 0f + + fun generateNextValue(): Float { + // Rotate 90deg in 10 seconds + heading += 0.1570796326794f + if (heading >= 2.0f * Math.PI.toFloat()) { + heading = 0.0f + } + return heading + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockLocationSensor.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockLocationSensor.kt new file mode 100644 index 0000000000..26d97ba450 --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockLocationSensor.kt @@ -0,0 +1,31 @@ +package com.asoy.wass.sdk.android.sensor + +import android.location.Location +import android.location.LocationManager +import javax.inject.Inject + +class MockLocationSensor +@Inject constructor() { + + private var currentPosition = 0 + private var step = 1 + + fun generateNextValue(): Location { + val lat = lats[currentPosition] + val long = longs[currentPosition] + currentPosition += step + if (currentPosition >= lats.size) { + step = -1 + currentPosition = lats.size - 1 + } else if (currentPosition <= 0) { + step = 1 + currentPosition = 0 + } + return Location(LocationManager.GPS_PROVIDER).also { location -> + location.accuracy = 0.0f + location.latitude = lat + location.longitude = long + location.altitude = 0.0 + } + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockLocations.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockLocations.kt new file mode 100644 index 0000000000..4d1c4fe6dc --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/mockdata/MockLocations.kt @@ -0,0 +1,661 @@ +package com.asoy.wass.sdk.android.sensor + +// This is just a list of extracted latitudes and longitudes from a real exercise + +internal val lats = listOf(60.22488, 60.22492, 60.22495, 60.22497, 60.225, 60.22502, 60.22505, + 60.22507, 60.22509, 60.22513, 60.22515, 60.22518, 60.2252, 60.22523, 60.22525, 60.22527, + 60.22529, 60.22532, 60.22534, 60.22536, 60.22538, 60.22541, 60.22552, 60.22563, 60.22571, + 60.22576, 60.22579, 60.22587, 60.22597, 60.226, 60.2261, 60.22612, 60.22615, 60.22618, + 60.22622, 60.22627, 60.22629, 60.22631, 60.22633, 60.22635, 60.22637, 60.22639, 60.22642, + 60.22644, 60.22649, 60.22653, 60.2266, 60.22668, 60.22672, 60.22675, 60.22683, 60.22686, + 60.22688, 60.22693, 60.22694, 60.22702, 60.22707, 60.22711, 60.22713, 60.22714, 60.22716, + 60.22717, 60.22718, 60.22719, 60.2272, 60.22722, 60.22723, 60.22724, 60.22724, 60.22725, + 60.22727, 60.22729, 60.2273, 60.22732, 60.22733, 60.22734, 60.22738, 60.2274, 60.22741, + 60.22745, 60.22747, 60.22749, 60.2275, 60.22752, 60.22757, 60.22761, 60.22763, 60.22765, + 60.22767, 60.22768, 60.2277, 60.22771, 60.22772, 60.22773, 60.22775, 60.2278, 60.22782, + 60.22782, 60.22782, 60.22783, 60.22782, 60.22782, 60.22782, 60.2278, 60.22778, 60.22778, + 60.22777, 60.22778, 60.22778, 60.22778, 60.22779, 60.22779, 60.2278, 60.2278, 60.22783, + 60.22783, 60.22784, 60.22784, 60.22784, 60.22784, 60.22784, 60.22784, 60.22785, 60.22787, + 60.22788, 60.22788, 60.22788, 60.22788, 60.22787, 60.22788, 60.22788, 60.22789, 60.22792, + 60.22795, 60.22796, 60.22795, 60.22793, 60.22795, 60.22795, 60.22794, 60.22793, 60.22791, + 60.22789, 60.22787, 60.22786, 60.22784, 60.22783, 60.2278, 60.22779, 60.22775, 60.22774, + 60.22773, 60.22772, 60.22771, 60.2277, 60.22768, 60.22765, 60.22764, 60.22761, 60.2276, + 60.2276, 60.2276, 60.22759, 60.22758, 60.22757, 60.22756, 60.22756, 60.22755, 60.22755, + 60.22754, 60.22753, 60.22752, 60.22752, 60.22752, 60.22753, 60.22754, 60.22755, 60.22756, + 60.22756, 60.22756, 60.22756, 60.22757, 60.22758, 60.22759, 60.22761, 60.22763, 60.22765, + 60.22766, 60.22767, 60.22768, 60.22769, 60.22769, 60.22771, 60.22773, 60.22774, 60.22776, + 60.22777, 60.2278, 60.22782, 60.22783, 60.22785, 60.22786, 60.22788, 60.2279, 60.22792, + 60.22793, 60.22795, 60.22796, 60.22798, 60.22799, 60.22801, 60.22802, 60.22803, 60.22804, + 60.22806, 60.22807, 60.22808, 60.22809, 60.2281, 60.2281, 60.22811, 60.22811, 60.22812, + 60.22813, 60.22813, 60.22813, 60.22815, 60.22817, 60.22818, 60.22818, 60.22819, 60.2282, + 60.22821, 60.22821, 60.22821, 60.22822, 60.22823, 60.22823, 60.22824, 60.22824, 60.22824, + 60.22824, 60.22825, 60.22825, 60.22826, 60.22826, 60.22827, 60.22827, 60.22827, 60.22827, + 60.22826, 60.22826, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, + 60.22825, 60.22825, 60.22825, 60.22825, 60.22826, 60.22826, 60.22826, 60.22826, 60.22826, + 60.22826, 60.22826, 60.22826, 60.22826, 60.22826, 60.22825, 60.22825, 60.22825, 60.22825, + 60.22825, 60.22824, 60.22825, 60.22825, 60.22825, 60.22825, 60.22825, 60.22826, 60.22826, + 60.22827, 60.22827, 60.22828, 60.22829, 60.22831, 60.22832, 60.22833, 60.22834, 60.22835, + 60.22838, 60.22839, 60.2284, 60.22841, 60.22843, 60.22844, 60.22845, 60.22846, 60.22848, + 60.22849, 60.2285, 60.22851, 60.22851, 60.22852, 60.22853, 60.22854, 60.22854, 60.2285, + 60.22847, 60.22845, 60.22843, 60.2284, 60.22838, 60.22835, 60.22832, 60.22829, 60.22826, + 60.22823, 60.2282, 60.22809, 60.22799, 60.2279, 60.22787, 60.22784, 60.22781, 60.22779, + 60.22776, 60.22774, 60.22771, 60.22768, 60.22765, 60.22763, 60.2276, 60.22757, 60.22755, + 60.22752, 60.22747, 60.22744, 60.22741, 60.22738, 60.22736, 60.22733, 60.2273, 60.2272, + 60.2271, 60.22699, 60.2269, 60.2268, 60.22669, 60.22662, 60.22654, 60.22652, 60.22648, + 60.22646, 60.22645, 60.22642, 60.22639, 60.22637, 60.22636, 60.22627, 60.22618, 60.2261, + 60.22602, 60.22594, 60.22591, 60.22588, 60.22585, 60.22583, 60.2258, 60.22578, 60.22575, + 60.22573, 60.22571, 60.2257, 60.22568, 60.22567, 60.22566, 60.22566, 60.22568, 60.22572, + 60.22573, 60.22576, 60.22579, 60.22582, 60.22585, 60.22587, 60.2259, 60.22592, 60.22594, + 60.22595, 60.22596, 60.22597, 60.22599, 60.22601, 60.22604, 60.22605, 60.22607, 60.22608, + 60.2261, 60.22611, 60.22613, 60.22614, 60.22616, 60.22619, 60.22622, 60.22624, 60.22625, + 60.22626, 60.22629, 60.22633, 60.22635, 60.22637, 60.2264, 60.22643, 60.22647, 60.22649, + 60.22651, 60.22652, 60.22654, 60.22655, 60.22658, 60.22659, 60.22661, 60.22662, 60.22665, + 60.22666, 60.22668, 60.2267, 60.22671, 60.22673, 60.22675, 60.22677, 60.2268, 60.22682, + 60.22689, 60.22691, 60.22694, 60.22696, 60.22699, 60.22702, 60.22704, 60.22706, 60.22709, + 60.22712, 60.22714, 60.22722, 60.22727, 60.22732, 60.22736, 60.22739, 60.22742, 60.22744, + 60.22748, 60.22751, 60.22754, 60.22756, 60.22759, 60.22762, 60.22765, 60.22767, 60.2277, + 60.22772, 60.22774, 60.22776, 60.22778, 60.2278, 60.22782, 60.22784, 60.22786, 60.22787, + 60.22789, 60.22791, 60.22793, 60.22795, 60.22797, 60.228, 60.22802, 60.22804, 60.22807, + 60.22811, 60.22814, 60.22818, 60.2282, 60.22823, 60.22825, 60.22827, 60.22829, 60.22831, + 60.22834, 60.22837, 60.22839, 60.22841, 60.22844, 60.22845, 60.22847, 60.22849, 60.22855, + 60.22858, 60.2286, 60.22863, 60.22866, 60.22869, 60.22872, 60.22875, 60.22877, 60.22881, + 60.22884, 60.22886, 60.22888, 60.22892, 60.22895, 60.22897, 60.22899, 60.22903, 60.22906, + 60.22909, 60.22913, 60.22917, 60.22922, 60.22925, 60.22928, 60.22931, 60.22935, 60.22938, + 60.22942, 60.22945, 60.22948, 60.22951, 60.22954, 60.22957, 60.2296, 60.22962, 60.22965, + 60.22968, 60.22978, 60.22986, 60.22987, 60.22989, 60.2299, 60.22992, 60.22995, 60.22997, + 60.22999, 60.23001, 60.23003, 60.23005, 60.23011, 60.23014, 60.2302, 60.23029, 60.23033, + 60.23038, 60.23042, 60.23043, 60.23045, 60.23046, 60.23045, 60.23043, 60.23043, 60.2304, + 60.23038, 60.23034, 60.2303, 60.23029, 60.23025, 60.2302, 60.23015, 60.23014, 60.23008, + 60.23001, 60.22994, 60.22987, 60.22982, 60.22978, 60.22976, 60.22973, 60.22969, 60.22962, + 60.22955, 60.22945, 60.22938, 60.22929, 60.22926, 60.22923, 60.22921, 60.22919, 60.22917, + 60.22916, 60.22913, 60.22912, 60.2291, 60.22909, 60.22905, 60.22899, 60.22893, 60.22889, + 60.22886, 60.22882, 60.22878, 60.22873, 60.22869, 60.22865, 60.22863, 60.22863, 60.22862, + 60.22862, 60.22861, 60.2286, 60.22859, 60.22858, 60.22858, 60.22858, 60.22858, 60.22858, + 60.22858, 60.22858, 60.22858, 60.22858, 60.22858, 60.22859, 60.22859, 60.2286, 60.2286, + 60.2286, 60.2286, 60.22861, 60.2286, 60.22859, 60.22858, 60.22856, 60.22855, 60.22853, + 60.22852, 60.22851, 60.2285, 60.22848, 60.22841, 60.22839, 60.22836, 60.22834, 60.22832, + 60.22829, 60.22827, 60.22824, 60.22822, 60.2282, 60.22818, 60.22815, 60.22813, 60.22811, + 60.22808, 60.22805, 60.22802, 60.228, 60.22797, 60.22794, 60.22791, 60.22789, 60.22787, + 60.22784, 60.22782, 60.22779, 60.22777, 60.22774, 60.22771, 60.22769, 60.22766, 60.22764, + 60.22761, 60.22759, 60.22757, 60.22754, 60.22752, 60.2275, 60.22747, 60.22744, 60.22742, + 60.2274, 60.22738, 60.22736, 60.22734, 60.22732, 60.22729, 60.22727, 60.22725, 60.22722, + 60.22719, 60.22716, 60.22714, 60.22712, 60.22709, 60.22707, 60.22704, 60.22702, 60.22699, + 60.22697, 60.22694, 60.22692, 60.22689, 60.22687, 60.22684, 60.22682, 60.2268, 60.22677, + 60.22675, 60.22673, 60.2267, 60.22668, 60.22666, 60.22663, 60.22661, 60.22659, 60.22656, + 60.22654, 60.22651, 60.22649, 60.22647, 60.22645, 60.22642, 60.2264, 60.22638, 60.22635, + 60.22633, 60.22631, 60.22629, 60.22627, 60.22624, 60.22622, 60.2262, 60.22618, 60.22616, + 60.22614, 60.22612, 60.22606, 60.22601, 60.22599, 60.22598, 60.22597, 60.22595, 60.22595, + 60.22594, 60.22592, 60.22591, 60.2259, 60.22589, 60.22588, 60.22586, 60.22585, 60.22582, + 60.22581, 60.2258, 60.22578, 60.22578, 60.22576, 60.22575, 60.22574, 60.22573, 60.22571, + 60.2257, 60.22569, 60.22567, 60.22566, 60.22564, 60.22563, 60.22562, 60.22561, 60.2256, + 60.22558, 60.22557, 60.22555, 60.22554, 60.22552, 60.2255, 60.22548, 60.22547, 60.22546, + 60.22545, 60.22544, 60.22543, 60.22541, 60.22541, 60.2254, 60.22539, 60.22538, 60.22537, + 60.22536, 60.22535, 60.22534, 60.22532, 60.22532, 60.22531, 60.2253, 60.22528, 60.22527, + 60.22525, 60.22524, 60.22523, 60.22521, 60.2252, 60.22518, 60.22517, 60.22516, 60.22515, + 60.22513, 60.22512, 60.22511, 60.2251, 60.2251, 60.22509, 60.22509, 60.22508, 60.22507, + 60.22507, 60.22507, 60.22507, 60.22507, 60.22507, 60.22506, 60.22506, 60.22505, 60.22505, + 60.22504, 60.22503, 60.22503, 60.22502, 60.22502, 60.22501, 60.22501, 60.225, 60.225, + 60.225, 60.225, 60.22499, 60.22499, 60.22497, 60.22496, 60.22496, 60.22496, 60.22496, + 60.22496, 60.22495, 60.22495, 60.22493, 60.22491, 60.22491, 60.22491, 60.22491, 60.22491, + 60.22492, 60.22492, 60.22492, 60.22492, 60.22492, 60.22491, 60.2249, 60.22489, 60.22489, + 60.22488, 60.22488, 60.22488, 60.22486, 60.22485, 60.22484, 60.22484, 60.22483, 60.2248, + 60.22478, 60.22477, 60.22477, 60.22477, 60.22478, 60.22481, 60.22482, 60.22485, 60.22487, + 60.22488, 60.22489, 60.22489, 60.2249, 60.22491, 60.22492, 60.22492, 60.22493, 60.22494, + 60.22495, 60.22496, 60.22498, 60.22499, 60.22499, 60.225, 60.22501, 60.22501, 60.22501, + 60.22501, 60.22501, 60.22501, 60.22502, 60.22502, 60.22504, 60.22504, 60.22505, 60.22508, + 60.22512, 60.22513, 60.22517, 60.22523, 60.22529, 60.22532, 60.22535, 60.22535, 60.22536, + 60.22536, 60.22538, 60.2254, 60.22543, 60.22545, 60.22548, 60.22551, 60.22551, 60.22548, + 60.22547, 60.22547, 60.22546, 60.22546, 60.22544, 60.22543, 60.22542, 60.22541, 60.22539, + 60.22538, 60.22536, 60.22535, 60.22528, 60.22521, 60.22513, 60.22509, 60.22506, 60.22504, + 60.22502, 60.22499, 60.22496, 60.22494, 60.22491, 60.22489, 60.22487, 60.22484, 60.22481, + 60.22479, 60.22476, 60.22473, 60.22471, 60.22468, 60.22466, 60.22463, 60.22461, 60.22458, + 60.22456, 60.22453, 60.2245, 60.22448, 60.22445, 60.22443, 60.2244, 60.22438, 60.22435, + 60.22433, 60.2243, 60.22428, 60.22425, 60.22423, 60.2242, 60.22418, 60.22416, 60.22414, + 60.22412, 60.22409, 60.22407, 60.22405, 60.22402, 60.22401, 60.22398, 60.22396, 60.22392, + 60.2239, 60.22387, 60.22386, 60.22383, 60.22382, 60.22384, 60.22385, 60.22382, 60.22383, + 60.22383, 60.22383, 60.22383, 60.22382, 60.2238, 60.2238, 60.22379, 60.22379, 60.2238, + 60.2238, 60.2238, 60.22381, 60.22382, 60.22383, 60.22384, 60.22384, 60.22385, 60.22385, + 60.22387, 60.22388, 60.2239, 60.22392, 60.22393, 60.22395, 60.22396, 60.22397, 60.22399, + 60.22408, 60.22418, 60.22425, 60.22428, 60.22431, 60.22435, 60.22436, 60.22437, 60.22438, + 60.22439, 60.2244, 60.22442, 60.22446, 60.22451, 60.22455, 60.22446, 60.22444, 60.22442, + 60.22439, 60.22437, 60.22433, 60.22431, 60.22428, 60.22426, 60.22423, 60.22421, 60.22418, + 60.22416, 60.22414, 60.22412, 60.22409, 60.22407, 60.22406, 60.22404, 60.22402, 60.22401, + 60.22399, 60.22397, 60.22396, 60.22394, 60.22392, 60.22389, 60.22387, 60.22386, 60.22384, + 60.22382, 60.2238, 60.22378, 60.22376, 60.22367, 60.22358, 60.2235, 60.22343, 60.22337, + 60.2233, 60.22323, 60.22315, 60.22306, 60.22302, 60.22299, 60.22298, 60.22296, 60.22294, + 60.22293, 60.22291, 60.22283, 60.22274, 60.22266, 60.22259, 60.22253, 60.22245, 60.22236, + 60.22227, 60.22216, 60.22209, 60.22207, 60.22205, 60.222, 60.22198, 60.22196, 60.22194, + 60.22192, 60.2219, 60.22188, 60.22185, 60.22182, 60.2218, 60.22177, 60.22175, 60.22173, + 60.2217, 60.22168, 60.22166, 60.22164, 60.22162, 60.22159, 60.22157, 60.22155, 60.22152, + 60.2215, 60.22148, 60.22145, 60.22143, 60.22141, 60.22139, 60.22136, 60.22134, 60.22131, + 60.22129, 60.22126, 60.22124, 60.22122, 60.2212, 60.22119, 60.22114, 60.2211, 60.22105, + 60.221, 60.22097, 60.22093, 60.22091, 60.22091, 60.22091, 60.2209, 60.22086, 60.22083, + 60.22079, 60.2207, 60.22067, 60.22066, 60.22065, 60.22064, 60.22063, 60.22062, 60.2206, + 60.22058, 60.22057, 60.22056, 60.22055, 60.22054, 60.22053, 60.22052, 60.22052, 60.22051, + 60.2205, 60.2205, 60.22049, 60.22048, 60.22048, 60.22047, 60.22046, 60.22045, 60.22044, + 60.22043, 60.22042, 60.22041, 60.2204, 60.2204, 60.22039, 60.22038, 60.22037, 60.22036, + 60.22036, 60.22034, 60.22033, 60.22033, 60.22032, 60.22032, 60.22031, 60.2203, 60.2203, + 60.22029, 60.22029, 60.22029, 60.22029, 60.22029, 60.22029, 60.22029, 60.22028, 60.22027, + 60.22023, 60.22022, 60.2202, 60.22018, 60.22016, 60.22014, 60.22012, 60.2201, 60.22007, + 60.22005, 60.22002, 60.21999, 60.21997, 60.21994, 60.21992, 60.2199, 60.21987, 60.21985, + 60.21983, 60.21981, 60.21979, 60.21977, 60.21974, 60.21971, 60.21969, 60.21967, 60.21964, + 60.21961, 60.21957, 60.21954, 60.21952, 60.21949, 60.21946, 60.21943, 60.2194, 60.21937, + 60.21934, 60.21931, 60.21929, 60.21926, 60.21924, 60.21921, 60.21919, 60.21916, 60.21914, + 60.21912, 60.2191, 60.21907, 60.21905, 60.21902, 60.219, 60.21898, 60.21895, 60.21892, + 60.2189, 60.21887, 60.21885, 60.21882, 60.2188, 60.21877, 60.21874, 60.21872, 60.21869, + 60.21867, 60.21865, 60.21862, 60.2186, 60.21857, 60.21854, 60.21851, 60.21848, 60.21845, + 60.21842, 60.21839, 60.21837, 60.21834, 60.21832, 60.21831, 60.21828, 60.21826, 60.21823, + 60.21821, 60.21819, 60.2181, 60.21808, 60.21806, 60.21802, 60.21799, 60.21797, 60.21794, + 60.21792, 60.21789, 60.21787, 60.21784, 60.21781, 60.21778, 60.21776, 60.21773, 60.21771, + 60.21769, 60.21766, 60.21764, 60.21762, 60.2176, 60.21757, 60.21755, 60.21753, 60.21751, + 60.21749, 60.21747, 60.21745, 60.21741, 60.21738, 60.21736, 60.21733, 60.2173, 60.21728, + 60.21726, 60.21724, 60.21721, 60.21719, 60.21717, 60.21714, 60.21712, 60.21709, 60.21707, + 60.21704, 60.21702, 60.21699, 60.21697, 60.21695, 60.21693, 60.2169, 60.21689, 60.21686, + 60.21684, 60.21673, 60.21663, 60.21661, 60.21658, 60.21656, 60.21654, 60.2165, 60.21644, + 60.21643, 60.21639, 60.21637, 60.21634, 60.21632, 60.2163, 60.21628, 60.21626, 60.21624, + 60.21621, 60.21619, 60.21616, 60.21614, 60.21611, 60.21609, 60.21607, 60.21603, 60.216, + 60.21598, 60.21596, 60.21593, 60.2159, 60.21586, 60.21583, 60.2158, 60.21577, 60.21575, + 60.21572, 60.2157, 60.21567, 60.21563, 60.21561, 60.21558, 60.21556, 60.21553, 60.21546, + 60.21544, 60.21541, 60.21539, 60.21536, 60.21534, 60.21532, 60.2153, 60.21529, 60.21528, + 60.21527, 60.21525, 60.21524, 60.21523, 60.21522, 60.21521, 60.2152, 60.2152, 60.21519, + 60.21519, 60.21518, 60.21518, 60.21518, 60.21518, 60.21518, 60.21517, 60.21516, 60.21516, + 60.21515, 60.21514, 60.21514, 60.21514, 60.21513, 60.21513, 60.21513, 60.21512, 60.21513, + 60.21513, 60.21513, 60.21514, 60.21514, 60.21515, 60.21516, 60.21516, 60.21518, 60.21519, + 60.21524, 60.2153, 60.21537, 60.21541, 60.21543, 60.21547, 60.21547, 60.21548, 60.21549, + 60.2155, 60.21551, 60.21552, 60.21553, 60.21553, 60.21553, 60.21552, 60.21552, 60.21551, + 60.2155, 60.21549, 60.21549, 60.21548, 60.21547, 60.21546, 60.21544, 60.21543, 60.21541, + 60.21539, 60.21538, 60.21536, 60.21534, 60.21532, 60.2153, 60.21528, 60.21525, 60.21523, + 60.21521, 60.21519, 60.21517, 60.21515, 60.21512, 60.2151, 60.21507, 60.21505, 60.21503, + 60.21501, 60.21499, 60.21497, 60.21495, 60.21493, 60.21491, 60.2149, 60.21488, 60.21486, + 60.21485, 60.21483, 60.21482, 60.21481, 60.21479, 60.21478, 60.21477, 60.21475, 60.21475, + 60.21474, 60.21473, 60.21472, 60.21471, 60.2147, 60.2147, 60.2147, 60.21469, 60.21469, + 60.21469, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, 60.21468, + 60.21467, 60.21467, 60.21467, 60.21467, 60.21466, 60.21466, 60.21466, 60.21465, 60.21464, + 60.21464, 60.21463, 60.21463, 60.21462, 60.21462, 60.21461, 60.21461, 60.21461, 60.21461, + 60.21461, 60.21461, 60.2146, 60.21459, 60.21458, 60.21458, 60.21457, 60.21457, 60.21456, + 60.21456, 60.21456, 60.21455, 60.21455, 60.21454, 60.21454, 60.21453, 60.21453, 60.21452, + 60.21452, 60.21451, 60.2145, 60.2145, 60.2145, 60.21449, 60.21449, 60.2145, 60.2145, + 60.2145, 60.2145, 60.2145, 60.21451, 60.21452, 60.21452, 60.21452, 60.21452, 60.21453, + 60.21453, 60.21453, 60.21453, 60.21453, 60.21453, 60.21452, 60.21452, 60.21452, 60.21451, + 60.2145, 60.2145, 60.21449, 60.21447, 60.21446, 60.21444, 60.21443, 60.21442, 60.2144, + 60.2144, 60.21438, 60.21437, 60.21437, 60.21436, 60.21436, 60.21435, 60.21435, 60.21435, + 60.21434, 60.21433, 60.21433, 60.21432, 60.21431, 60.2143, 60.2143, 60.21429, 60.21429, + 60.21428, 60.21426, 60.21425, 60.21424, 60.21423, 60.21422, 60.2142, 60.21419, 60.21418, + 60.21416, 60.21415, 60.21414, 60.21412, 60.21411, 60.2141, 60.21408, 60.21407, 60.21405, + 60.21404, 60.21403, 60.21401, 60.214, 60.21398, 60.21397, 60.21395, 60.21393, 60.21391, + 60.21389, 60.21388, 60.21386, 60.21385, 60.21383, 60.21382, 60.21381, 60.21379, 60.21378, + 60.21376, 60.21375, 60.21374, 60.21372, 60.2137, 60.21368, 60.21367, 60.21365, 60.21364, + 60.21362, 60.21361, 60.2136, 60.21358, 60.21357, 60.21356, 60.21355, 60.21354, 60.21353, + 60.21352, 60.21351, 60.2135, 60.21348, 60.21347, 60.21345, 60.21344, 60.21342, 60.21341, + 60.2134, 60.21339, 60.21338, 60.21337, 60.21336, 60.21336, 60.21335, 60.21334, 60.21334, + 60.21333, 60.21333, 60.21333, 60.21333, 60.21333, 60.21333, 60.21332, 60.2133, 60.21329, + 60.21328, 60.21326, 60.21325, 60.21321, 60.21319, 60.21316, 60.21314, 60.21311, 60.21308, + 60.21304, 60.21301, 60.21298, 60.21294, 60.21291, 60.21288, 60.21285, 60.21282, 60.21279, + 60.21276, 60.21274, 60.21271, 60.21268, 60.21266, 60.21263, 60.2126, 60.21258, 60.21255, + 60.21252, 60.2125, 60.21247, 60.21244, 60.21241, 60.21238, 60.21235, 60.21233, 60.2123, + 60.21228, 60.21225, 60.21222, 60.21219, 60.21217, 60.21214, 60.21212, 60.2121, 60.21208, + 60.21206, 60.21204, 60.21202, 60.212, 60.21199, 60.21198, 60.21196, 60.21196, 60.21196, + 60.21196, 60.21195, 60.21195, 60.21196, 60.21195, 60.21196, 60.21196, 60.21196, 60.21196, + 60.21196, 60.21195, 60.21194, 60.21193, 60.21191, 60.2119, 60.21188, 60.21186, 60.21185, + 60.21182, 60.2118, 60.21178, 60.21175, 60.21173, 60.21171, 60.21169, 60.21167, 60.21166, + 60.21164, 60.21163, 60.21161, 60.21159, 60.21158, 60.21157, 60.21155, 60.21154, 60.21153, + 60.21152, 60.21151, 60.2115, 60.21149, 60.21148, 60.21146, 60.21145, 60.21144, 60.21143, + 60.21142, 60.21141, 60.21139, 60.21138, 60.21138, 60.21138, 60.21138, 60.21139, 60.21141, + 60.21143, 60.21146, 60.21149, 60.21152, 60.21154, 60.21157, 60.21159, 60.21162, 60.21164, + 60.21167, 60.21169, 60.21172, 60.21174, 60.21177, 60.21179, 60.21181, 60.21184, 60.21186, + 60.21189, 60.21191, 60.21194, 60.21196, 60.21199, 60.21201, 60.21204, 60.21206, 60.21208, + 60.21211, 60.21213, 60.21215, 60.21217, 60.2122, 60.21222, 60.21224, 60.21227, 60.21229, + 60.21231, 60.21234, 60.21236, 60.21238, 60.2124, 60.21243, 60.21245, 60.21247, 60.21249, + 60.21252, 60.21254, 60.21257, 60.21259, 60.21261, 60.21263, 60.21266, 60.21268, 60.21271, + 60.21273, 60.21276, 60.21278, 60.2128, 60.21283, 60.21285, 60.21288, 60.2129, 60.21293, + 60.21295, 60.21297, 60.213, 60.21302, 60.21304, 60.21307, 60.2131, 60.21312, 60.21315, + 60.21317, 60.2132, 60.21322, 60.21325, 60.21327, 60.2133, 60.21332, 60.21335, 60.21337, + 60.2134, 60.21342, 60.21345, 60.21347, 60.21349, 60.21351, 60.21354, 60.21356, 60.21358, + 60.2136, 60.21363, 60.21365, 60.21367, 60.21369, 60.21372, 60.21374, 60.21377, 60.21379, + 60.21382, 60.21384, 60.21386, 60.21389, 60.21391, 60.21394, 60.21396, 60.21399, 60.21401, + 60.21404, 60.21406, 60.21409, 60.21412, 60.21414, 60.21416, 60.21419, 60.21421, 60.21424, + 60.21426, 60.21429, 60.21431, 60.21433, 60.21436, 60.21438, 60.21441, 60.21443, 60.21445, + 60.21448, 60.2145, 60.21453, 60.21456, 60.21458, 60.2146, 60.21463, 60.21465, 60.21467, + 60.2147, 60.21472, 60.21474, 60.21477, 60.21479, 60.21481, 60.21484, 60.21486, 60.21489, + 60.21491, 60.21494, 60.21496, 60.21499, 60.21501, 60.21504, 60.21506, 60.21509, 60.21511, + 60.21513, 60.21516, 60.21518, 60.21521, 60.21523, 60.21526, 60.21528, 60.21531, 60.21533, + 60.21536, 60.21538, 60.21541, 60.21543, 60.21546, 60.21548, 60.21551, 60.21554, 60.21556, + 60.21558, 60.21561, 60.21564, 60.21566, 60.21569, 60.21571, 60.21573, 60.21576, 60.21578, + 60.21581, 60.21583, 60.21585, 60.21588, 60.2159, 60.21592, 60.21595, 60.21597, 60.216, + 60.21602, 60.21604, 60.21606, 60.21609, 60.21611, 60.21613, 60.21616, 60.21618, 60.2162, + 60.21623, 60.21625, 60.21627, 60.2163, 60.21632, 60.21634, 60.21637, 60.21639, 60.21642, + 60.21644, 60.21646, 60.21649, 60.21651, 60.21653, 60.21654, 60.21654, 60.21655, 60.21656, + 60.21658, 60.2166, 60.21662, 60.21664, 60.21666, 60.21668, 60.21671, 60.21673, 60.21675, + 60.21677, 60.21679, 60.21681, 60.21683, 60.21684, 60.21686, 60.21687, 60.21689, 60.21691, + 60.21692, 60.21693, 60.21695, 60.21696, 60.21698, 60.217, 60.21702, 60.21704, 60.21706, + 60.21708, 60.2171, 60.21711, 60.21713, 60.21716, 60.21719, 60.21721, 60.21722, 60.21724, + 60.21727, 60.21729, 60.21731, 60.21733, 60.21735, 60.21737, 60.21739, 60.2174, 60.21742, + 60.21744, 60.21745, 60.21747, 60.21748, 60.21749, 60.2175, 60.21752, 60.21752, 60.21754, + 60.21755, 60.21757, 60.21762, 60.2177, 60.21778, 60.21786, 60.21794, 60.21796, 60.21801, + 60.21806, 60.21809, 60.21812, 60.21813, 60.21814, 60.21815, 60.21815, 60.21816, 60.21816, + 60.21816, 60.21816, 60.21816, 60.21817, 60.21818, 60.21819, 60.2182, 60.2182, 60.21827, + 60.21836, 60.21844, 60.21852, 60.21858, 60.21865, 60.2187, 60.21873, 60.21875, 60.21877, + 60.21877, 60.21878, 60.21879, 60.2188, 60.21882, 60.21883, 60.21883, 60.21884, 60.21884, + 60.21884, 60.21884, 60.21885, 60.21884, 60.21884, 60.21884, 60.21883, 60.21882, 60.21881, + 60.2188, 60.21879, 60.21878, 60.21878, 60.21878, 60.21878, 60.21878, 60.21878, 60.21879, + 60.21879, 60.2188, 60.21881, 60.21882, 60.21883, 60.21883, 60.21884, 60.21884, 60.21885, + 60.21885, 60.21886, 60.21887, 60.21888, 60.21888, 60.21889, 60.21889, 60.21889, 60.21888, + 60.21889, 60.21889, 60.2189, 60.21891, 60.21892, 60.21894, 60.21896, 60.21898, 60.219, + 60.21902, 60.21904, 60.21906, 60.21908, 60.2191, 60.21912, 60.21914, 60.21916, 60.21918, + 60.2192, 60.21922, 60.21924, 60.21926, 60.21928, 60.2193, 60.21932, 60.21934, 60.21936, + 60.21938, 60.2194, 60.21942, 60.21944, 60.21951, 60.21953, 60.21956, 60.21957, 60.21958, + 60.2196, 60.21963, 60.21971, 60.21976, 60.21977, 60.21979, 60.2198, 60.21983, 60.21984, + 60.21986, 60.21988, 60.2199, 60.21992, 60.21994, 60.21996, 60.21998, 60.21999, 60.22008, + 60.22015, 60.22017, 60.2202, 60.22021, 60.22022, 60.22029, 60.22033, 60.22037, 60.22039, + 60.22041, 60.22043, 60.22045, 60.22047, 60.22049, 60.22051, 60.22053, 60.22056, 60.22058, + 60.2206, 60.22062, 60.22064, 60.22066, 60.22067, 60.22069, 60.22071, 60.22073, 60.22075, + 60.22078, 60.22079, 60.22081, 60.22083, 60.22085, 60.22087, 60.22089, 60.22092, 60.22094, + 60.22096, 60.22098, 60.221, 60.22103, 60.22105, 60.22106, 60.22107, 60.22109, 60.2211, + 60.22112, 60.22113, 60.22114, 60.22115, 60.22117, 60.22118, 60.22119, 60.2212, 60.22122, + 60.22124, 60.22124, 60.22124, 60.22123, 60.22122, 60.22121, 60.2212, 60.2212, 60.2212, + 60.2212, 60.2212, 60.22121, 60.22125, 60.22127, 60.22129, 60.2213, 60.22132, 60.22134, + 60.22136, 60.22138, 60.2214, 60.22142, 60.22144, 60.22146, 60.22148, 60.2215, 60.22153, + 60.22155, 60.22158, 60.2216, 60.22162, 60.22164, 60.22166, 60.22168, 60.2217, 60.22172, + 60.22174, 60.22176, 60.22179, 60.22182, 60.22184, 60.22188, 60.22192, 60.22194, 60.22197, + 60.222, 60.22202, 60.22205, 60.22207, 60.2221, 60.22211, 60.22213, 60.22215, 60.22217, + 60.22219, 60.22222, 60.22224, 60.22227, 60.22229, 60.22232, 60.22234, 60.22236, 60.22237, + 60.22238, 60.22239, 60.22241, 60.22243, 60.22245, 60.22248, 60.2225, 60.22252, 60.22254, + 60.22255, 60.22258, 60.22259, 60.22264, 60.22271, 60.22274, 60.22276, 60.22278, 60.22281, + 60.22283, 60.22287, 60.22289, 60.22292, 60.22294, 60.22297, 60.223, 60.22303, 60.22306, + 60.22309, 60.22312, 60.22316, 60.22318, 60.22321, 60.22324, 60.22328, 60.2233, 60.22332, + 60.22335, 60.22337, 60.22338, 60.2234, 60.22342, 60.22345, 60.22347, 60.22349, 60.22351, + 60.22352, 60.22354, 60.22355, 60.22357, 60.22358, 60.2236, 60.22362, 60.22363, 60.22365, + 60.22368, 60.2237, 60.22371, 60.22373, 60.22375, 60.22377, 60.22378, 60.2238, 60.22381, + 60.22384, 60.22385, 60.22387, 60.22389, 60.22398, 60.22404, 60.22409, 60.2241, 60.22412, + 60.22414, 60.22416, 60.22417, 60.22418, 60.22419, 60.22421, 60.22422, 60.22424, 60.22425, + 60.22427, 60.22429, 60.22431, 60.22434, 60.22436, 60.22439, 60.22441, 60.22443, 60.22445, + 60.22447, 60.22449, 60.22457, 60.22465, 60.22471, 60.22472, 60.22474, 60.22475, 60.22477, + 60.22478, 60.2248, 60.22486, 60.22489, 60.22491, 60.22493, 60.22495, 60.22497, 60.225, + 60.22502, 60.22504, 60.22506, 60.22513, 60.22516, 60.22517, 60.22519, 60.22522, 60.22525, + 60.22527, 60.22529, 60.22531, 60.22533, 60.22535, 60.22537, 60.22539, 60.22542, 60.22544, + 60.22546, 60.22549, 60.22551, 60.22552, 60.22554, 60.22557, 60.22559, 60.22561, 60.22563, + 60.22565, 60.22567, 60.22569, 60.22571, 60.22572, 60.22574, 60.22575, 60.22577, 60.22579, + 60.2258, 60.22582, 60.22584, 60.22586, 60.22588, 60.2259, 60.22591, 60.22593, 60.22595, + 60.22596, 60.22598, 60.226, 60.22602, 60.22605, 60.22607, 60.22609, 60.22611, 60.22612, + 60.22614, 60.22615, 60.22617, 60.22619, 60.2262, 60.22623, 60.22625, 60.22629, 60.22632, + 60.22634, 60.22636, 60.22641, 60.22643, 60.22646, 60.22648, 60.22654, 60.22655, 60.22657, + 60.22658, 60.2266, 60.22662, 60.22664, 60.22666, 60.22668, 60.22671, 60.22673, 60.22676, + 60.22678, 60.22681, 60.22684, 60.22687, 60.22689, 60.22691, 60.22693, 60.22695, 60.22698, + 60.227, 60.22703, 60.22705, 60.22707, 60.22709, 60.22711, 60.22713, 60.22715, 60.22717, + 60.22719, 60.22727, 60.22729, 60.22732, 60.22734, 60.22735, 60.22738, 60.22741, 60.22743, + 60.22744, 60.22747, 60.22751, 60.22753, 60.22755, 60.22757, 60.22759, 60.22761, 60.22763, + 60.22765, 60.22767, 60.22769, 60.22771, 60.22773, 60.22775, 60.22779, 60.22782, 60.22784, + 60.22786, 60.22789, 60.22791, 60.22793, 60.22796, 60.22798, 60.228, 60.22803, 60.22806, + 60.22808, 60.2281, 60.22813, 60.22815, 60.22817, 60.22821, 60.22824, 60.22826, 60.22829, + 60.22832, 60.22835, 60.22838, 60.2284, 60.22842, 60.22844, 60.22846, 60.22848, 60.22849, + 60.2285, 60.2285, 60.2285, 60.2285, 60.22849, 60.22849, 60.22849, 60.22848, 60.22847, + 60.22846, 60.22845, 60.22844, 60.22843, 60.22842, 60.22841, 60.2284, 60.22839, 60.22838, + 60.22837, 60.22836, 60.22835, 60.22834, 60.22833, 60.22832, 60.22831, 60.2283, 60.22829, + 60.22828, 60.22827, 60.22826, 60.22826, 60.22825, 60.22825, 60.22824, 60.22824, 60.22823, + 60.22823, 60.22823, 60.22823, 60.22823, 60.22824, 60.22824, 60.22824, 60.22825, 60.22826, + 60.22826, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, 60.22827, + 60.22827, 60.22827, 60.22826, 60.22826, 60.22826, 60.22826, 60.22827, 60.22827, 60.22827, + 60.22827, 60.22828, 60.22828, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, + 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, 60.22829, + 60.22829, 60.22828, 60.22828, 60.22827, 60.22827, 60.22826, 60.22826, 60.22824, 60.22823, + 60.22822, 60.2282, 60.22818, 60.22817, 60.22816, 60.22814, 60.22813, 60.22811, 60.2281, + 60.22808, 60.22807, 60.22805, 60.22804, 60.22803, 60.22802, 60.22801, 60.22799, 60.22798, + 60.22797, 60.22796, 60.22794, 60.22793, 60.22792, 60.2279, 60.22789, 60.22787, 60.22786, + 60.22785, 60.22784, 60.22782, 60.22781, 60.2278, 60.22779, 60.22777, 60.22776, 60.22774, + 60.22773, 60.22771, 60.22769, 60.22767, 60.22765, 60.22763, 60.22761, 60.22759, 60.22757, + 60.22755, 60.22753, 60.22751, 60.22749, 60.22748, 60.22747, 60.22747, 60.22748, 60.22749, + 60.2275, 60.22752, 60.22754, 60.22756, 60.22757, 60.22759, 60.2276, 60.22762, 60.22763, + 60.22764, 60.22766, 60.22767, 60.22767, 60.22768, 60.22768, 60.22768, 60.22768, 60.22769, + 60.2277, 60.2277, 60.22771, 60.22772, 60.22772, 60.22774, 60.22775, 60.22776, 60.22777, + 60.22778, 60.2278, 60.22781, 60.22782, 60.22784, 60.22784, 60.22785, 60.22786, 60.22787, + 60.22788, 60.2279, 60.22792, 60.22793, 60.22795, 60.22797, 60.22799, 60.228, 60.22802, + 60.22803, 60.22804, 60.22804, 60.22803, 60.22801, 60.22798, 60.22796, 60.22793, 60.22791, + 60.22789, 60.22788, 60.22787, 60.22786, 60.22786, 60.22785, 60.22785, 60.22784, 60.22784, + 60.22784, 60.22783, 60.22783, 60.22782, 60.22781, 60.22781, 60.22781, 60.22782, 60.22782, + 60.22782, 60.22782, 60.22782, 60.22782, 60.22781, 60.22781, 60.22781, 60.22781, 60.22782, + 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, 60.22782, + 60.22781, 60.22781, 60.22781, 60.22781, 60.2278, 60.2278, 60.2278, 60.2278, 60.2278, + 60.22779, 60.22779, 60.22779, 60.22778, 60.22777, 60.22776, 60.22776, 60.22775, 60.22775, + 60.22775, 60.22775, 60.22775, 60.22775, 60.22775, 60.22776, 60.22775, 60.22775, 60.22774, + 60.22774, 60.22773, 60.22773, 60.22772, 60.22772, 60.22772, 60.22771, 60.22771, 60.22771, + 60.2277, 60.22769, 60.22767, 60.22765, 60.22763, 60.2276, 60.22759, 60.22757, 60.22756, + 60.22754, 60.22752, 60.2275, 60.22748, 60.22746, 60.22745, 60.22743, 60.22742, 60.2274, + 60.22738, 60.22737, 60.22734, 60.22732, 60.2273, 60.22728, 60.22726, 60.22725, 60.22723, + 60.22721, 60.2272, 60.22718, 60.22717, 60.22715, 60.22713, 60.22711, 60.22709, 60.22706, + 60.22704, 60.22702, 60.22699, 60.22696, 60.22693, 60.22691, 60.22688, 60.22686, 60.22683, + 60.22679, 60.22676, 60.22673, 60.2267, 60.22666, 60.22662, 60.22659, 60.22655, 60.22652, + 60.22649, 60.22645, 60.22642, 60.22638, 60.22635, 60.22632, 60.22629, 60.22626, 60.22622, + 60.22619, 60.22615, 60.22612, 60.22608, 60.22605, 60.22601, 60.22598, 60.22595, 60.22592, + 60.22588, 60.22585, 60.22582, 60.22579, 60.22575, 60.22571, 60.22567, 60.22564, 60.2256, + 60.22556, 60.22552, 60.22548, 60.22545, 60.22541, 60.22537, 60.22534, 60.2253, 60.22526, + 60.22522, 60.22518, 60.22514, 60.2251, 60.22506, 60.22503, 60.22499, 60.22496, 60.22491, + 60.22487) + +internal val longs = listOf(25.07488, 25.07488, 25.07487, 25.07485, 25.07483, 25.07481, 25.07478, + 25.07476, 25.07474, 25.07471, 25.07468, 25.07464, 25.0746, 25.07457, 25.07455, 25.07454, + 25.07452, 25.07451, 25.07448, 25.07447, 25.07445, 25.07443, 25.07436, 25.07429, 25.07419, + 25.07418, 25.07414, 25.07401, 25.07392, 25.07391, 25.07383, 25.07381, 25.0738, 25.07379, + 25.07378, 25.07375, 25.0737, 25.07367, 25.07365, 25.07362, 25.0736, 25.07359, 25.07357, + 25.07355, 25.0735, 25.07346, 25.07335, 25.07322, 25.07315, 25.07312, 25.07301, 25.07298, + 25.07296, 25.07289, 25.07285, 25.07269, 25.07253, 25.07243, 25.07237, 25.07232, 25.07228, + 25.07222, 25.07217, 25.07211, 25.07205, 25.07199, 25.07194, 25.07188, 25.07184, 25.07179, + 25.07175, 25.0717, 25.07164, 25.07159, 25.07155, 25.07151, 25.07142, 25.07138, 25.07132, + 25.07122, 25.07117, 25.07113, 25.0711, 25.07106, 25.07087, 25.07072, 25.07067, 25.07062, + 25.07058, 25.07053, 25.07049, 25.07046, 25.07042, 25.07037, 25.07032, 25.07014, 25.06999, + 25.06994, 25.06974, 25.06954, 25.06935, 25.06915, 25.06897, 25.06889, 25.06881, 25.06861, + 25.06851, 25.06847, 25.06842, 25.06837, 25.06833, 25.06814, 25.06791, 25.06786, 25.06765, + 25.06759, 25.06754, 25.06748, 25.06743, 25.06738, 25.06733, 25.06728, 25.06706, 25.06684, + 25.06673, 25.06669, 25.06664, 25.0666, 25.06655, 25.06637, 25.06618, 25.06595, 25.06575, + 25.06561, 25.06557, 25.06552, 25.06545, 25.06541, 25.06535, 25.06529, 25.06523, 25.06515, + 25.06509, 25.06505, 25.06502, 25.06498, 25.06494, 25.06486, 25.06481, 25.06469, 25.06466, + 25.06462, 25.06457, 25.06453, 25.06447, 25.06429, 25.06409, 25.06386, 25.06371, 25.06367, + 25.06362, 25.06357, 25.06352, 25.06348, 25.06344, 25.06337, 25.06333, 25.06328, 25.06323, + 25.06318, 25.06314, 25.06309, 25.06304, 25.06298, 25.06293, 25.06288, 25.06283, 25.0628, + 25.06275, 25.0627, 25.06264, 25.06259, 25.06254, 25.06248, 25.06243, 25.06239, 25.06234, + 25.06229, 25.06224, 25.06219, 25.06215, 25.06209, 25.06205, 25.062, 25.06195, 25.0619, + 25.06186, 25.06183, 25.0618, 25.06177, 25.06173, 25.06169, 25.06165, 25.0616, 25.06157, + 25.06152, 25.06148, 25.06143, 25.06138, 25.06134, 25.0613, 25.06126, 25.06122, 25.06118, + 25.06113, 25.06109, 25.06104, 25.06099, 25.06095, 25.0609, 25.06086, 25.06082, 25.06078, + 25.06074, 25.06069, 25.06064, 25.0606, 25.06056, 25.06052, 25.06047, 25.06042, 25.06036, + 25.06031, 25.06026, 25.06021, 25.06015, 25.06011, 25.06006, 25.06001, 25.05995, 25.0599, + 25.05985, 25.0598, 25.05975, 25.0597, 25.05965, 25.0596, 25.05955, 25.0595, 25.05946, + 25.05941, 25.05937, 25.05932, 25.05928, 25.05923, 25.05919, 25.05914, 25.0591, 25.05905, + 25.059, 25.05895, 25.0589, 25.05886, 25.05881, 25.05876, 25.05871, 25.05866, 25.05861, + 25.05856, 25.0585, 25.05846, 25.05841, 25.05837, 25.05832, 25.05827, 25.05823, 25.05819, + 25.05815, 25.0581, 25.05805, 25.05801, 25.05797, 25.05792, 25.05787, 25.05782, 25.05776, + 25.05771, 25.05766, 25.0576, 25.05754, 25.05748, 25.05742, 25.05736, 25.0573, 25.05724, + 25.05707, 25.05703, 25.05698, 25.05693, 25.05689, 25.05684, 25.0568, 25.05676, 25.05672, + 25.05668, 25.05663, 25.05659, 25.05654, 25.05649, 25.05644, 25.05638, 25.05633, 25.05619, + 25.05616, 25.05613, 25.0561, 25.05608, 25.05607, 25.05606, 25.05605, 25.05603, 25.05602, + 25.056, 25.05598, 25.05594, 25.05591, 25.05593, 25.05593, 25.05594, 25.05595, 25.05595, + 25.05596, 25.05597, 25.05598, 25.05599, 25.05599, 25.05598, 25.05599, 25.05598, 25.05597, + 25.05597, 25.05595, 25.05595, 25.05593, 25.05592, 25.0559, 25.05589, 25.05588, 25.05576, + 25.05565, 25.05554, 25.05547, 25.05541, 25.05532, 25.05521, 25.0551, 25.05507, 25.05499, + 25.05494, 25.05488, 25.0548, 25.05473, 25.0547, 25.05467, 25.05454, 25.05441, 25.0543, + 25.05418, 25.05407, 25.05404, 25.05397, 25.05392, 25.05388, 25.05383, 25.0538, 25.05375, + 25.05372, 25.0537, 25.05367, 25.05364, 25.0536, 25.05354, 25.05348, 25.05329, 25.05309, + 25.05298, 25.05292, 25.05289, 25.05286, 25.05283, 25.05279, 25.05275, 25.05272, 25.05268, + 25.05265, 25.05261, 25.05258, 25.05255, 25.0525, 25.05244, 25.05241, 25.05237, 25.05233, + 25.0523, 25.05226, 25.05223, 25.0522, 25.05215, 25.05211, 25.05206, 25.05203, 25.052, + 25.05197, 25.05193, 25.05189, 25.05188, 25.05187, 25.05186, 25.05186, 25.05184, 25.05183, + 25.05181, 25.05178, 25.05176, 25.05173, 25.0517, 25.05166, 25.05164, 25.05161, 25.05156, + 25.05153, 25.0515, 25.05148, 25.05146, 25.05143, 25.05141, 25.05136, 25.05133, 25.05131, + 25.05128, 25.05127, 25.05129, 25.05129, 25.05129, 25.05128, 25.05128, 25.05129, 25.0513, + 25.05132, 25.05134, 25.05137, 25.05137, 25.05137, 25.05137, 25.05137, 25.05137, 25.05136, + 25.05136, 25.05135, 25.05133, 25.05131, 25.05129, 25.05128, 25.05126, 25.05124, 25.05121, + 25.05119, 25.05117, 25.05115, 25.05113, 25.05111, 25.05108, 25.05106, 25.05104, 25.05101, + 25.05099, 25.05095, 25.05091, 25.05087, 25.05083, 25.05079, 25.05076, 25.05074, 25.05072, + 25.05072, 25.05071, 25.05069, 25.05069, 25.05067, 25.05065, 25.05063, 25.0506, 25.05058, + 25.05055, 25.05053, 25.05051, 25.05049, 25.05048, 25.05046, 25.05045, 25.05044, 25.05041, + 25.0504, 25.05039, 25.05038, 25.05037, 25.05037, 25.05037, 25.05038, 25.05039, 25.05048, + 25.05049, 25.05049, 25.05049, 25.05048, 25.05045, 25.05045, 25.05045, 25.05045, 25.05046, + 25.05047, 25.05049, 25.05051, 25.05055, 25.0506, 25.05066, 25.05071, 25.05076, 25.05079, + 25.05082, 25.05084, 25.05087, 25.0509, 25.05092, 25.05093, 25.05094, 25.05092, 25.05091, + 25.0509, 25.05081, 25.05064, 25.05059, 25.05054, 25.05049, 25.05044, 25.05039, 25.05034, + 25.05029, 25.05025, 25.0502, 25.05014, 25.04998, 25.04993, 25.04979, 25.0496, 25.04943, + 25.04928, 25.04911, 25.04891, 25.04871, 25.04851, 25.0483, 25.04809, 25.0479, 25.04771, + 25.04751, 25.04732, 25.04712, 25.04693, 25.04676, 25.04658, 25.04638, 25.04631, 25.04614, + 25.04599, 25.04582, 25.04566, 25.04548, 25.04526, 25.04504, 25.04486, 25.04469, 25.0445, + 25.04434, 25.04416, 25.04402, 25.04384, 25.04373, 25.04361, 25.04354, 25.04348, 25.04342, + 25.04336, 25.04331, 25.04327, 25.04322, 25.04316, 25.04298, 25.04281, 25.04265, 25.04243, + 25.04223, 25.04206, 25.04189, 25.04168, 25.04149, 25.04127, 25.04111, 25.04106, 25.04101, + 25.04095, 25.0409, 25.04084, 25.04079, 25.04068, 25.04062, 25.04057, 25.04051, 25.04046, + 25.04041, 25.04035, 25.0403, 25.04025, 25.04019, 25.04013, 25.04007, 25.04001, 25.03995, + 25.03989, 25.03983, 25.03978, 25.03974, 25.0397, 25.03966, 25.0396, 25.03955, 25.03949, + 25.03943, 25.03937, 25.03932, 25.03926, 25.03909, 25.03906, 25.03902, 25.039, 25.03897, + 25.03894, 25.03892, 25.0389, 25.03887, 25.03885, 25.03882, 25.0388, 25.03877, 25.03875, + 25.03872, 25.03869, 25.03867, 25.03864, 25.03861, 25.03859, 25.03856, 25.03855, 25.03852, + 25.03849, 25.03847, 25.03844, 25.03841, 25.03839, 25.03836, 25.03834, 25.03832, 25.03829, + 25.03827, 25.03825, 25.03823, 25.0382, 25.03817, 25.03814, 25.03811, 25.03809, 25.03806, + 25.03804, 25.03801, 25.03799, 25.03797, 25.03794, 25.03792, 25.0379, 25.03788, 25.03785, + 25.03783, 25.0378, 25.03778, 25.03775, 25.03772, 25.0377, 25.03768, 25.03765, 25.03763, + 25.03761, 25.03758, 25.03756, 25.03753, 25.0375, 25.03748, 25.03746, 25.03744, 25.03742, + 25.03739, 25.03736, 25.03733, 25.0373, 25.03727, 25.03724, 25.03722, 25.03719, 25.03717, + 25.03714, 25.03712, 25.0371, 25.03708, 25.03705, 25.03702, 25.037, 25.03698, 25.03695, + 25.03693, 25.0369, 25.03687, 25.03684, 25.03681, 25.03679, 25.03675, 25.03671, 25.03667, + 25.03663, 25.03659, 25.03651, 25.03635, 25.03627, 25.03623, 25.03618, 25.03611, 25.03606, + 25.03602, 25.03595, 25.03591, 25.03586, 25.03581, 25.03576, 25.03573, 25.03569, 25.03565, + 25.03561, 25.03557, 25.03553, 25.03548, 25.03544, 25.03538, 25.03533, 25.03528, 25.03524, + 25.03519, 25.03513, 25.03508, 25.03502, 25.03497, 25.03493, 25.03488, 25.03483, 25.03479, + 25.03474, 25.03469, 25.03464, 25.03459, 25.03454, 25.03448, 25.03443, 25.03438, 25.03433, + 25.03428, 25.03424, 25.03419, 25.03414, 25.0341, 25.03405, 25.034, 25.03396, 25.03392, + 25.03387, 25.03384, 25.0338, 25.03374, 25.03369, 25.03365, 25.0336, 25.03356, 25.03352, + 25.03348, 25.03344, 25.0334, 25.03337, 25.03332, 25.03328, 25.03324, 25.03318, 25.03312, + 25.03306, 25.03301, 25.03295, 25.03289, 25.03284, 25.03279, 25.03274, 25.03269, 25.03263, + 25.03257, 25.03251, 25.03246, 25.0324, 25.03234, 25.03229, 25.03224, 25.03218, 25.03213, + 25.03208, 25.03202, 25.03197, 25.03191, 25.03185, 25.03179, 25.03174, 25.03168, 25.03163, + 25.03157, 25.03152, 25.03147, 25.03142, 25.03137, 25.03132, 25.03127, 25.03122, 25.03117, + 25.03112, 25.03107, 25.03102, 25.0308, 25.03059, 25.03049, 25.03044, 25.03039, 25.03035, + 25.03031, 25.03027, 25.03023, 25.03018, 25.03013, 25.03003, 25.02996, 25.0299, 25.02985, + 25.02978, 25.02973, 25.02968, 25.02947, 25.02942, 25.02937, 25.02932, 25.02927, 25.02905, + 25.02894, 25.02888, 25.02883, 25.0286, 25.02838, 25.02818, 25.02797, 25.02777, 25.02763, + 25.02758, 25.02754, 25.02749, 25.02743, 25.02738, 25.02733, 25.02729, 25.02724, 25.02719, + 25.02714, 25.02709, 25.02704, 25.02699, 25.02693, 25.02687, 25.02682, 25.02676, 25.0267, + 25.02664, 25.02658, 25.02652, 25.02647, 25.02641, 25.02618, 25.02607, 25.02602, 25.02582, + 25.02563, 25.02543, 25.02525, 25.02507, 25.02488, 25.02472, 25.02453, 25.02447, 25.02442, + 25.02437, 25.02429, 25.02419, 25.02411, 25.02407, 25.02399, 25.02382, 25.02362, 25.02347, + 25.02343, 25.02338, 25.02334, 25.02329, 25.02324, 25.02319, 25.02314, 25.02308, 25.02303, + 25.02298, 25.02292, 25.02287, 25.02271, 25.02256, 25.02244, 25.02238, 25.02235, 25.02232, + 25.0223, 25.02228, 25.02226, 25.02224, 25.02221, 25.02219, 25.02216, 25.02213, 25.02211, + 25.02209, 25.02207, 25.02204, 25.02202, 25.02201, 25.02199, 25.02197, 25.02194, 25.02192, + 25.0219, 25.02187, 25.02186, 25.02184, 25.02182, 25.0218, 25.02178, 25.02176, 25.02174, + 25.02172, 25.0217, 25.02168, 25.02166, 25.02164, 25.02161, 25.02158, 25.02156, 25.02154, + 25.02151, 25.02149, 25.02148, 25.02147, 25.02147, 25.02148, 25.02148, 25.02148, 25.02146, + 25.02144, 25.0214, 25.02138, 25.02133, 25.02129, 25.02107, 25.02086, 25.0207, 25.02065, + 25.0206, 25.02056, 25.02051, 25.02044, 25.02037, 25.02031, 25.02011, 25.02004, 25.01999, + 25.01993, 25.01986, 25.01982, 25.01977, 25.01972, 25.01966, 25.01961, 25.01957, 25.01951, + 25.01947, 25.01942, 25.01938, 25.01935, 25.01931, 25.01927, 25.01922, 25.01917, 25.01914, + 25.01901, 25.01887, 25.0187, 25.01851, 25.01829, 25.01809, 25.01804, 25.01799, 25.01794, + 25.01789, 25.01784, 25.01779, 25.01759, 25.01743, 25.01724, 25.01714, 25.01716, 25.01719, + 25.01721, 25.01723, 25.01724, 25.01724, 25.01723, 25.01722, 25.01722, 25.01721, 25.0172, + 25.01719, 25.01718, 25.01717, 25.01714, 25.01713, 25.01711, 25.01707, 25.01704, 25.01701, + 25.01697, 25.01694, 25.01691, 25.01687, 25.01684, 25.01681, 25.01677, 25.01674, 25.01671, + 25.01668, 25.01665, 25.01661, 25.0166, 25.01648, 25.01634, 25.01618, 25.01601, 25.01584, + 25.01568, 25.01553, 25.01539, 25.01525, 25.01519, 25.01516, 25.01513, 25.0151, 25.01507, + 25.01504, 25.01501, 25.01489, 25.01475, 25.01464, 25.01451, 25.01437, 25.01427, 25.01421, + 25.01416, 25.01414, 25.01415, 25.01416, 25.01418, 25.01419, 25.0142, 25.01421, 25.01422, + 25.01424, 25.01426, 25.01429, 25.01431, 25.01433, 25.01435, 25.01436, 25.01439, 25.01441, + 25.01445, 25.01448, 25.01452, 25.01456, 25.0146, 25.01463, 25.01466, 25.01469, 25.01472, + 25.01475, 25.01476, 25.01479, 25.01482, 25.01484, 25.01487, 25.0149, 25.01492, 25.01491, + 25.01491, 25.01488, 25.01483, 25.01478, 25.01471, 25.01465, 25.01447, 25.01428, 25.01411, + 25.01395, 25.01377, 25.01358, 25.01338, 25.01317, 25.01299, 25.01281, 25.01264, 25.01244, + 25.01227, 25.01204, 25.01185, 25.01179, 25.01174, 25.01168, 25.01163, 25.01158, 25.01153, + 25.01148, 25.01143, 25.01138, 25.01133, 25.01128, 25.01123, 25.01118, 25.01112, 25.01108, + 25.01103, 25.01098, 25.01093, 25.01089, 25.01084, 25.0108, 25.01074, 25.0107, 25.01065, + 25.0106, 25.01055, 25.01051, 25.01046, 25.01041, 25.01037, 25.01032, 25.01027, 25.01022, + 25.01017, 25.01012, 25.01007, 25.01002, 25.00997, 25.00992, 25.00988, 25.00983, 25.00979, + 25.00974, 25.0097, 25.00965, 25.0096, 25.00956, 25.00951, 25.00947, 25.00941, 25.00936, + 25.00918, 25.009, 25.00882, 25.00871, 25.00865, 25.00862, 25.00861, 25.00859, 25.00857, + 25.00856, 25.00854, 25.00854, 25.00852, 25.00851, 25.0085, 25.00849, 25.00848, 25.00847, + 25.00845, 25.00844, 25.00842, 25.00841, 25.00839, 25.00837, 25.00836, 25.00835, 25.00833, + 25.00831, 25.0083, 25.00828, 25.00827, 25.00825, 25.00824, 25.00823, 25.00822, 25.00821, + 25.0082, 25.00818, 25.00816, 25.00815, 25.00814, 25.00814, 25.00814, 25.00813, 25.00814, + 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, 25.00814, + 25.00814, 25.00815, 25.00815, 25.00815, 25.00815, 25.00814, 25.00814, 25.00813, 25.00813, + 25.00813, 25.00812, 25.00812, 25.00813, 25.00812, 25.00813, 25.00813, 25.00813, 25.00815, + 25.00816, 25.00816, 25.00817, 25.00818, 25.0082, 25.00822, 25.00826, 25.00829, 25.00832, + 25.00835, 25.00838, 25.00852, 25.00854, 25.00856, 25.00862, 25.00865, 25.00867, 25.0087, + 25.00873, 25.00875, 25.00876, 25.00877, 25.00879, 25.00881, 25.00883, 25.00885, 25.00885, + 25.00887, 25.00889, 25.00889, 25.00891, 25.00893, 25.00895, 25.00897, 25.00899, 25.00902, + 25.00905, 25.00907, 25.0091, 25.00914, 25.00917, 25.00918, 25.0092, 25.00922, 25.00923, + 25.00925, 25.00925, 25.00926, 25.00928, 25.00929, 25.0093, 25.00931, 25.00932, 25.00932, + 25.00932, 25.00933, 25.00933, 25.00933, 25.00934, 25.00935, 25.00936, 25.00937, 25.00938, + 25.00939, 25.0094, 25.00941, 25.00942, 25.00943, 25.00947, 25.00949, 25.00955, 25.00963, + 25.00965, 25.00967, 25.0097, 25.00971, 25.00973, 25.00976, 25.00978, 25.0098, 25.00982, + 25.00983, 25.00984, 25.00985, 25.00984, 25.00984, 25.00984, 25.00983, 25.00981, 25.0098, + 25.00978, 25.00977, 25.00977, 25.00976, 25.00976, 25.00977, 25.00978, 25.00978, 25.0098, + 25.00982, 25.00984, 25.00985, 25.00986, 25.00987, 25.00988, 25.00989, 25.0099, 25.00992, + 25.00994, 25.00996, 25.00998, 25.00999, 25.01001, 25.01004, 25.01008, 25.01012, 25.01016, + 25.01021, 25.01024, 25.01028, 25.01032, 25.01036, 25.0104, 25.01044, 25.01047, 25.01051, + 25.01056, 25.01059, 25.01063, 25.0107, 25.01075, 25.01079, 25.01084, 25.01088, 25.01093, + 25.01097, 25.01102, 25.01106, 25.0111, 25.01115, 25.01119, 25.01123, 25.01131, 25.01135, + 25.01139, 25.01144, 25.01147, 25.01152, 25.01156, 25.01161, 25.01166, 25.01171, 25.01177, + 25.01201, 25.01217, 25.01234, 25.01253, 25.01274, 25.01294, 25.013, 25.01306, 25.01311, + 25.01316, 25.01321, 25.01327, 25.01332, 25.01337, 25.01342, 25.01347, 25.01353, 25.01359, + 25.01365, 25.0137, 25.01375, 25.0138, 25.01385, 25.0139, 25.01395, 25.01398, 25.01402, + 25.01405, 25.01409, 25.01413, 25.01417, 25.0142, 25.01423, 25.01427, 25.0143, 25.01434, + 25.01437, 25.01439, 25.01442, 25.01445, 25.01449, 25.01452, 25.01455, 25.01459, 25.01462, + 25.01465, 25.01469, 25.01473, 25.01477, 25.0148, 25.01485, 25.01488, 25.01491, 25.01495, + 25.015, 25.01503, 25.01508, 25.01513, 25.01518, 25.01524, 25.01529, 25.01536, 25.01542, + 25.01548, 25.01554, 25.0156, 25.01566, 25.01572, 25.01577, 25.01582, 25.01588, 25.01593, + 25.01598, 25.01603, 25.01608, 25.01613, 25.01619, 25.01624, 25.01629, 25.01634, 25.01639, + 25.01645, 25.01651, 25.01656, 25.01662, 25.01668, 25.01674, 25.0168, 25.01686, 25.01691, + 25.01697, 25.01702, 25.01707, 25.01713, 25.01718, 25.01723, 25.01729, 25.01734, 25.01738, + 25.01744, 25.01749, 25.01754, 25.01759, 25.01764, 25.01769, 25.01774, 25.01779, 25.01784, + 25.01789, 25.01793, 25.01798, 25.01803, 25.01809, 25.01814, 25.01819, 25.01823, 25.01828, + 25.01832, 25.01836, 25.01851, 25.01855, 25.01859, 25.01864, 25.01868, 25.01873, 25.01878, + 25.01883, 25.01887, 25.01892, 25.01909, 25.01914, 25.01921, 25.01926, 25.01932, 25.01939, + 25.01944, 25.0195, 25.01956, 25.01962, 25.01968, 25.01973, 25.01979, 25.01984, 25.0199, + 25.01997, 25.02002, 25.02008, 25.02013, 25.02017, 25.02022, 25.02027, 25.02032, 25.02038, + 25.02043, 25.02049, 25.02054, 25.0206, 25.02065, 25.0207, 25.02075, 25.0208, 25.02085, + 25.0209, 25.02095, 25.021, 25.02106, 25.02111, 25.02116, 25.02121, 25.02127, 25.02132, + 25.02137, 25.02142, 25.02147, 25.02152, 25.02157, 25.02162, 25.02168, 25.02173, 25.02178, + 25.02183, 25.02188, 25.02193, 25.02199, 25.02203, 25.02208, 25.02213, 25.02217, 25.02221, + 25.02225, 25.0223, 25.02235, 25.02239, 25.02244, 25.02248, 25.02252, 25.02257, 25.02261, + 25.02265, 25.02269, 25.02272, 25.02276, 25.0228, 25.02284, 25.02288, 25.02291, 25.02294, + 25.02298, 25.02302, 25.02305, 25.02309, 25.02313, 25.02316, 25.02319, 25.02322, 25.02326, + 25.02329, 25.02332, 25.02336, 25.0234, 25.02344, 25.02349, 25.02352, 25.02357, 25.02361, + 25.02366, 25.02371, 25.02375, 25.0238, 25.02384, 25.02387, 25.02391, 25.02394, 25.02399, + 25.02404, 25.02409, 25.02415, 25.02419, 25.02423, 25.02427, 25.02432, 25.02436, 25.02441, + 25.02445, 25.02449, 25.02454, 25.02457, 25.02462, 25.02466, 25.0247, 25.02474, 25.02477, + 25.0248, 25.02483, 25.02485, 25.02491, 25.02493, 25.02498, 25.025, 25.02504, 25.02507, + 25.02509, 25.02512, 25.02515, 25.02518, 25.0252, 25.02522, 25.02524, 25.02526, 25.02527, + 25.02528, 25.02529, 25.02531, 25.02532, 25.02533, 25.02535, 25.02536, 25.02537, 25.02538, + 25.02538, 25.02539, 25.02539, 25.02539, 25.0254, 25.02541, 25.02541, 25.02541, 25.02541, + 25.02542, 25.02542, 25.02542, 25.02542, 25.02544, 25.02545, 25.02547, 25.0255, 25.02552, + 25.02554, 25.02556, 25.02558, 25.0256, 25.02564, 25.02569, 25.02576, 25.0258, 25.02584, + 25.02588, 25.02592, 25.02597, 25.02601, 25.02608, 25.02612, 25.02617, 25.02622, 25.02627, + 25.02632, 25.02636, 25.02642, 25.02646, 25.02651, 25.02656, 25.02661, 25.02666, 25.02671, + 25.02675, 25.02678, 25.02682, 25.02686, 25.02689, 25.02693, 25.02697, 25.02701, 25.02704, + 25.0271, 25.02715, 25.02719, 25.02723, 25.02728, 25.02732, 25.02737, 25.02741, 25.02746, + 25.02751, 25.02757, 25.02762, 25.02767, 25.02772, 25.02776, 25.02781, 25.02786, 25.02791, + 25.02795, 25.02799, 25.02804, 25.02808, 25.02812, 25.02816, 25.02821, 25.02826, 25.0283, + 25.02833, 25.02836, 25.02838, 25.0284, 25.02842, 25.02844, 25.02846, 25.02848, 25.02849, + 25.02852, 25.02854, 25.02856, 25.02858, 25.02861, 25.02863, 25.02865, 25.02867, 25.02869, + 25.02871, 25.02873, 25.02875, 25.02877, 25.02879, 25.02881, 25.02883, 25.02885, 25.02888, + 25.0289, 25.02893, 25.02895, 25.02897, 25.029, 25.02902, 25.02904, 25.02907, 25.02909, + 25.02911, 25.02913, 25.02915, 25.02918, 25.0292, 25.02923, 25.02925, 25.02927, 25.0293, + 25.02932, 25.02934, 25.02937, 25.02939, 25.02941, 25.02942, 25.02944, 25.02946, 25.02949, + 25.02951, 25.02953, 25.02955, 25.02957, 25.02959, 25.02961, 25.02964, 25.02966, 25.02968, + 25.02971, 25.02973, 25.02975, 25.02977, 25.02979, 25.02981, 25.02982, 25.02985, 25.02987, + 25.02989, 25.02991, 25.02993, 25.02996, 25.02997, 25.02999, 25.03002, 25.03004, 25.03006, + 25.03008, 25.03011, 25.03013, 25.03016, 25.03018, 25.03021, 25.03023, 25.03025, 25.03027, + 25.03029, 25.03031, 25.03034, 25.03036, 25.03038, 25.0304, 25.03043, 25.03045, 25.03047, + 25.03049, 25.03051, 25.03054, 25.03056, 25.03058, 25.03059, 25.03061, 25.03064, 25.03066, + 25.03068, 25.0307, 25.03071, 25.03073, 25.03076, 25.03078, 25.0308, 25.03082, 25.03084, + 25.03086, 25.03088, 25.03091, 25.03093, 25.03095, 25.03097, 25.03099, 25.03101, 25.03103, + 25.03105, 25.03107, 25.03109, 25.03112, 25.03114, 25.03116, 25.03119, 25.03121, 25.03123, + 25.03126, 25.03128, 25.0313, 25.03132, 25.03134, 25.03136, 25.03138, 25.0314, 25.03142, + 25.03144, 25.03146, 25.03148, 25.0315, 25.03152, 25.03154, 25.03156, 25.03158, 25.03161, + 25.03163, 25.03165, 25.03167, 25.03169, 25.03171, 25.03173, 25.03175, 25.03177, 25.0318, + 25.03182, 25.03184, 25.03186, 25.03188, 25.0319, 25.03192, 25.03194, 25.03196, 25.03198, + 25.032, 25.03202, 25.03205, 25.03207, 25.03209, 25.03211, 25.03213, 25.03216, 25.03218, + 25.0322, 25.03223, 25.03225, 25.03227, 25.03229, 25.03231, 25.03233, 25.03234, 25.03236, + 25.03238, 25.03241, 25.03243, 25.03245, 25.03248, 25.0325, 25.03253, 25.03255, 25.03257, + 25.03259, 25.03261, 25.03263, 25.03265, 25.03268, 25.0327, 25.03272, 25.03274, 25.03276, + 25.03278, 25.03279, 25.03282, 25.03284, 25.03288, 25.03292, 25.03296, 25.03301, 25.03304, + 25.03308, 25.03311, 25.03313, 25.03315, 25.03317, 25.03318, 25.0332, 25.03322, 25.03325, + 25.03329, 25.03332, 25.03337, 25.03341, 25.03346, 25.0335, 25.03355, 25.03359, 25.03364, + 25.03367, 25.03371, 25.03376, 25.03381, 25.03385, 25.0339, 25.03396, 25.034, 25.03405, + 25.03409, 25.03413, 25.03417, 25.0342, 25.03422, 25.03424, 25.03426, 25.03428, 25.03431, + 25.03434, 25.03437, 25.03441, 25.03444, 25.03446, 25.0345, 25.03452, 25.03455, 25.0346, + 25.03464, 25.03468, 25.03472, 25.03477, 25.03482, 25.03487, 25.03496, 25.03502, 25.03511, + 25.03515, 25.03519, 25.03535, 25.03548, 25.03561, 25.03573, 25.03588, 25.03592, 25.03607, + 25.03625, 25.03645, 25.03667, 25.03683, 25.03688, 25.03697, 25.03702, 25.03706, 25.03712, + 25.03716, 25.0372, 25.03724, 25.03728, 25.03739, 25.03743, 25.03746, 25.03753, 25.0377, + 25.03782, 25.03795, 25.0381, 25.03826, 25.03843, 25.0386, 25.03879, 25.03898, 25.03918, + 25.03941, 25.0396, 25.03978, 25.03999, 25.0402, 25.04038, 25.04044, 25.04049, 25.04053, + 25.04057, 25.04068, 25.04072, 25.04077, 25.04081, 25.04085, 25.04091, 25.04096, 25.041, + 25.04103, 25.04106, 25.04112, 25.04116, 25.0412, 25.04125, 25.04131, 25.04135, 25.0414, + 25.04145, 25.0415, 25.04154, 25.04159, 25.04162, 25.04166, 25.04171, 25.04175, 25.04179, + 25.04183, 25.04187, 25.04192, 25.04196, 25.04201, 25.04205, 25.04212, 25.04216, 25.0422, + 25.04227, 25.0423, 25.04235, 25.0424, 25.04245, 25.04249, 25.04253, 25.04256, 25.0426, + 25.04263, 25.04267, 25.0427, 25.04273, 25.04276, 25.0428, 25.04283, 25.04286, 25.04289, + 25.04292, 25.04295, 25.04298, 25.04302, 25.04306, 25.04309, 25.04312, 25.04316, 25.04319, + 25.04322, 25.04326, 25.04329, 25.04333, 25.04348, 25.0435, 25.04353, 25.04356, 25.04359, + 25.04362, 25.04366, 25.04379, 25.04389, 25.04393, 25.04396, 25.04398, 25.04402, 25.04405, + 25.04407, 25.04411, 25.04414, 25.04416, 25.0442, 25.04424, 25.04427, 25.0443, 25.04439, + 25.04448, 25.04453, 25.0446, 25.04466, 25.04471, 25.04489, 25.04495, 25.04499, 25.045, + 25.04502, 25.04504, 25.04506, 25.04507, 25.04508, 25.04509, 25.04511, 25.04512, 25.04513, + 25.04515, 25.04515, 25.04516, 25.04518, 25.04521, 25.04526, 25.04528, 25.0453, 25.04533, + 25.04535, 25.04537, 25.0454, 25.04542, 25.04544, 25.04547, 25.0455, 25.04554, 25.04558, + 25.04561, 25.04565, 25.0457, 25.04575, 25.0458, 25.04585, 25.0459, 25.04595, 25.046, + 25.04606, 25.0461, 25.04615, 25.04621, 25.04626, 25.04632, 25.04637, 25.04642, 25.04654, + 25.04661, 25.04668, 25.04674, 25.0468, 25.04686, 25.04691, 25.04696, 25.04701, 25.04706, + 25.0471, 25.04714, 25.04718, 25.04724, 25.04726, 25.0473, 25.04733, 25.04737, 25.0474, + 25.04743, 25.04747, 25.04751, 25.04755, 25.04759, 25.04763, 25.04767, 25.04769, 25.04771, + 25.04773, 25.04774, 25.04774, 25.04773, 25.0477, 25.04769, 25.04768, 25.04766, 25.04765, + 25.04764, 25.04766, 25.04769, 25.04769, 25.04769, 25.04769, 25.04765, 25.04762, 25.04761, + 25.04761, 25.04761, 25.04762, 25.04764, 25.04767, 25.0477, 25.04773, 25.04776, 25.04778, + 25.0478, 25.04782, 25.04785, 25.04788, 25.04791, 25.04794, 25.04797, 25.048, 25.04802, + 25.04806, 25.04809, 25.04813, 25.04816, 25.0482, 25.04823, 25.04827, 25.0483, 25.04833, + 25.04836, 25.04839, 25.04842, 25.04849, 25.04861, 25.04865, 25.0487, 25.04873, 25.04877, + 25.04881, 25.04888, 25.04891, 25.04893, 25.04895, 25.04897, 25.04899, 25.04898, 25.04896, + 25.04896, 25.04895, 25.04894, 25.04895, 25.04895, 25.04897, 25.04899, 25.049, 25.04901, + 25.04902, 25.04905, 25.04907, 25.0491, 25.04912, 25.04915, 25.04917, 25.0492, 25.04923, + 25.04927, 25.0493, 25.04934, 25.04939, 25.04944, 25.04948, 25.04953, 25.04958, 25.04962, + 25.04966, 25.0497, 25.04974, 25.04978, 25.04982, 25.04985, 25.04988, 25.0499, 25.04993, + 25.04994, 25.04997, 25.04999, 25.05002, 25.05013, 25.0503, 25.05039, 25.05041, 25.05044, + 25.05046, 25.05048, 25.05051, 25.05055, 25.05059, 25.05063, 25.05068, 25.05074, 25.05079, + 25.05085, 25.05091, 25.05096, 25.05101, 25.05105, 25.05109, 25.05113, 25.05117, 25.0512, + 25.05124, 25.05128, 25.05142, 25.05153, 25.05167, 25.0517, 25.05174, 25.05176, 25.05179, + 25.05182, 25.05185, 25.05196, 25.05203, 25.05206, 25.0521, 25.05211, 25.05214, 25.05218, + 25.05222, 25.05224, 25.05228, 25.05243, 25.05255, 25.05261, 25.05262, 25.05265, 25.05267, + 25.05269, 25.05272, 25.05275, 25.05279, 25.05283, 25.05286, 25.05289, 25.05293, 25.05297, + 25.053, 25.05303, 25.05307, 25.05311, 25.05315, 25.05317, 25.0532, 25.05323, 25.05328, + 25.05332, 25.05337, 25.05341, 25.05345, 25.05348, 25.05352, 25.05355, 25.05358, 25.05361, + 25.05364, 25.05368, 25.05372, 25.05375, 25.05377, 25.05381, 25.05383, 25.05386, 25.05388, + 25.05391, 25.05393, 25.05396, 25.05399, 25.05403, 25.05407, 25.05411, 25.05414, 25.05417, + 25.0542, 25.05424, 25.05426, 25.05429, 25.05432, 25.05435, 25.05437, 25.05444, 25.0545, + 25.05454, 25.05456, 25.05461, 25.05464, 25.05468, 25.05471, 25.05481, 25.05485, 25.05489, + 25.05492, 25.05495, 25.05496, 25.05499, 25.05501, 25.05503, 25.05506, 25.05508, 25.05511, + 25.05513, 25.05515, 25.05517, 25.05519, 25.0552, 25.05522, 25.05525, 25.05528, 25.0553, + 25.05531, 25.05532, 25.05534, 25.05536, 25.05538, 25.05541, 25.05543, 25.05546, 25.05548, + 25.05551, 25.05558, 25.05561, 25.05562, 25.05565, 25.05567, 25.0557, 25.05572, 25.05574, + 25.05576, 25.05578, 25.05579, 25.05582, 25.05582, 25.05583, 25.05584, 25.05585, 25.05586, + 25.05587, 25.05587, 25.05587, 25.05588, 25.05587, 25.05585, 25.05584, 25.05582, 25.05581, + 25.05579, 25.05577, 25.05576, 25.05575, 25.05575, 25.05575, 25.05576, 25.05578, 25.05579, + 25.0558, 25.05581, 25.05583, 25.05583, 25.05584, 25.05585, 25.05586, 25.05589, 25.05591, + 25.05593, 25.05596, 25.05599, 25.05603, 25.05605, 25.05608, 25.0561, 25.05614, 25.05619, + 25.05625, 25.0563, 25.05636, 25.05642, 25.05646, 25.05651, 25.05655, 25.0566, 25.05663, + 25.05667, 25.05671, 25.05675, 25.05679, 25.05683, 25.05687, 25.05691, 25.05695, 25.05699, + 25.05703, 25.05707, 25.05712, 25.05716, 25.05719, 25.05723, 25.05727, 25.05731, 25.05735, + 25.05739, 25.05743, 25.05747, 25.05751, 25.05757, 25.05763, 25.05769, 25.05774, 25.05779, + 25.05785, 25.0579, 25.05795, 25.05801, 25.05806, 25.05812, 25.05817, 25.05823, 25.05828, + 25.05834, 25.05839, 25.05844, 25.0585, 25.05855, 25.0586, 25.05866, 25.05871, 25.05876, + 25.05881, 25.05886, 25.0589, 25.05895, 25.059, 25.05905, 25.05911, 25.05917, 25.05922, + 25.05927, 25.05932, 25.05938, 25.05943, 25.05949, 25.05954, 25.0596, 25.05966, 25.05971, + 25.05977, 25.05983, 25.05989, 25.05994, 25.06, 25.06006, 25.06011, 25.06016, 25.06021, + 25.06027, 25.06033, 25.06038, 25.06042, 25.06048, 25.06054, 25.0606, 25.06066, 25.0607, + 25.06075, 25.0608, 25.06084, 25.06088, 25.06093, 25.06099, 25.06105, 25.06109, 25.06115, + 25.0612, 25.06125, 25.06129, 25.06134, 25.06139, 25.06144, 25.06149, 25.06153, 25.06158, + 25.06162, 25.06166, 25.06171, 25.06175, 25.0618, 25.06185, 25.0619, 25.06196, 25.06201, + 25.06206, 25.06211, 25.06215, 25.06219, 25.06224, 25.06228, 25.06232, 25.06237, 25.06242, + 25.06246, 25.06251, 25.06255, 25.06259, 25.06263, 25.06268, 25.06272, 25.06275, 25.06279, + 25.06282, 25.06285, 25.06288, 25.06291, 25.06293, 25.063, 25.06308, 25.06313, 25.06318, + 25.06323, 25.06327, 25.06332, 25.06336, 25.06341, 25.06346, 25.06351, 25.06356, 25.06362, + 25.06367, 25.06373, 25.06377, 25.06382, 25.06387, 25.06392, 25.06397, 25.06403, 25.06408, + 25.06414, 25.06419, 25.06423, 25.06431, 25.06435, 25.0644, 25.06446, 25.06451, 25.06456, + 25.06462, 25.06467, 25.06473, 25.06477, 25.06483, 25.06488, 25.06493, 25.06498, 25.06502, + 25.06507, 25.06512, 25.06516, 25.0652, 25.06525, 25.0653, 25.06535, 25.0654, 25.06546, + 25.0655, 25.06556, 25.06561, 25.06567, 25.06571, 25.06575, 25.0658, 25.06585, 25.06588, + 25.06592, 25.06595, 25.066, 25.06605, 25.0661, 25.06614, 25.06619, 25.06623, 25.06627, + 25.06632, 25.06638, 25.06644, 25.0665, 25.06655, 25.06662, 25.06668, 25.06674, 25.06681, + 25.06688, 25.06695, 25.06702, 25.06709, 25.06715, 25.06721, 25.06728, 25.06734, 25.06741, + 25.06749, 25.06755, 25.06762, 25.06767, 25.06774, 25.06779, 25.06786, 25.06793, 25.06799, + 25.06805, 25.06811, 25.06818, 25.06823, 25.06829, 25.06836, 25.06842, 25.06848, 25.06854, + 25.06861, 25.06868, 25.06874, 25.06881, 25.06888, 25.06896, 25.06903, 25.0691, 25.06916, + 25.06924, 25.06932, 25.0694, 25.06947, 25.06954, 25.06961, 25.06968, 25.06976, 25.06984, + 25.06991, 25.06998, 25.07006, 25.07014, 25.07022, 25.0703, 25.07037, 25.07044, 25.07052, + 25.07059, 25.07066, 25.07072, 25.07079, 25.07084, 25.07089, 25.07095, 25.07101, 25.07107, + 25.07112, 25.07119, 25.07126, 25.07132, 25.07138, 25.07144, 25.07151, 25.07158, 25.07165, + 25.07171, 25.07177, 25.07185, 25.07192, 25.07199, 25.07206, 25.07212, 25.07218, 25.07224, + 25.07228, 25.07234, 25.0724, 25.07246, 25.07253, 25.07259, 25.07265, 25.0727, 25.07277, + 25.07283, 25.07288, 25.07294, 25.073, 25.07304, 25.07309, 25.07314, 25.07319, 25.07323, + 25.07328, 25.07331, 25.07337, 25.07342, 25.07346, 25.0735, 25.07353, 25.07357, 25.07361, + 25.07366, 25.07371, 25.07374, 25.07377, 25.07379, 25.07382, 25.07385, 25.07387, 25.07391, + 25.07394, 25.07397, 25.074, 25.07402, 25.07404, 25.07407, 25.0741, 25.07412, 25.07414, + 25.07415, 25.07417, 25.07421, 25.07425, 25.07428, 25.07431, 25.07434, 25.07436, 25.07439, + 25.07442, 25.07446, 25.07449, 25.07453, 25.07457, 25.0746, 25.07463, 25.07466, 25.07469, + 25.07472, 25.07475, 25.07478, 25.07481, 25.07484, 25.07487, 25.0749, 25.07493, 25.07496, + 25.075)
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/ui/MapboxMapView.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/ui/MapboxMapView.kt new file mode 100644 index 0000000000..04fe3828cc --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/ui/MapboxMapView.kt @@ -0,0 +1,282 @@ +package com.example.mapbox.ui + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.Resources +import android.location.Location +import android.view.Gravity +import android.view.MotionEvent +import android.view.View +import com.example.mapbox.R +import com.example.mapbox.breadcrumb.ExerciseEngineState +import com.example.mapbox.extensions.getBitmapFromDrawable +import com.example.mapbox.extensions.latLong +import com.mapbox.mapboxsdk.camera.CameraPosition +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.location.LocationComponentOptions +import com.mapbox.mapboxsdk.location.OnCameraTrackingChangedListener +import com.mapbox.mapboxsdk.location.OnLocationCameraTransitionListener +import com.mapbox.mapboxsdk.location.OnLocationStaleListener +import com.mapbox.mapboxsdk.location.modes.CameraMode +import com.mapbox.mapboxsdk.location.modes.RenderMode +import com.mapbox.mapboxsdk.maps.* +import com.soy.android.maps.breadcrumb.Breadcrumb +import com.soy.android.maps.compass.WassCompassEngine +import com.soy.android.maps.extensions.getActivatedLocationComponent +import com.soy.android.maps.extensions.isCameraInTrackingMode +import timber.log.Timber +import kotlin.math.roundToInt + +internal const val INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION = 14 +/** + * Map is centered at Helsinki when we don't have user's current or any last location + */ +private const val DEFAULT_INITIAL_CAMERA_POSITION_LATITUDE = 60.1699 +private const val DEFAULT_INITIAL_CAMERA_POSITION_LONGITUDE = 24.9384 + +private const val CAMERA_ANIMATION_DURATION = 200L + +internal fun buildCameraPosition( + target: LatLng = LatLng(DEFAULT_INITIAL_CAMERA_POSITION_LATITUDE, DEFAULT_INITIAL_CAMERA_POSITION_LONGITUDE), + zoomIndex: Int = INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION +) = CameraPosition.Builder().target(target).zoom(zoomIndex.toDouble()).build() + +/** + * [MapboxMapOptions] can either be applied via xml or programmatically when [MapView] is + * constructed. This function provides a predefined set of options. + */ +private fun createMapboxMapOptions(resources: Resources, location: Location?): MapboxMapOptions { + val cameraPosition = if (location == null) { + // Use default location and zoom level + buildCameraPosition() + } else { + buildCameraPosition(LatLng(location.latitude, location.longitude), INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION) + } + return MapboxMapOptions().apply { + val compassImageTopMargin = resources.getDimension(R.dimen.size_spacing_xxsmall).roundToInt() + compassMargins(intArrayOf(0, compassImageTopMargin, 0, 0)) + compassEnabled(true) + compassImage(resources.getDrawable(R.drawable.ic_shape_north_indicator, null)) + compassGravity(Gravity.CENTER) + textureMode(true) + attributionEnabled(false) + logoEnabled(false) + zoomGesturesEnabled(true) + compassFadesWhenFacingNorth(false) + rotateGesturesEnabled(false) + camera(cameraPosition) + } +} + +internal const val START_SYMBOL_ICON_ID = "id-start-icon" +internal const val PAUSE_LINE_PATTERN = "id-stale-line-pattern" + +/** + * This class extends [MapView] and is suggested to use when creating map programmatically with a + * given cameraPosition which is used to center the camera on map. This view doesn't allow touch + * interactions for the child views of [MapView] such as compass, logo, attribute. + */ +@SuppressLint("ViewConstructor") +class MapboxMapView( + context: Context, + location: Location? = null, + private val isBreadcrumbEnabled: Boolean = true +) : MapView(context, createMapboxMapOptions(context.resources, location)), OnLocationStaleListener, + OnCameraTrackingChangedListener, MapboxMap.OnMapClickListener, OnMapReadyCallback, MapboxMap.OnMapLongClickListener { + + init { + id = View.generateViewId() + } + + private var map: MapboxMap? = null + + private var breadcrumb: Breadcrumb? = null + + private var exerciseEngineState = ExerciseEngineState.Recording + + /** + * A boolean which keeps track of location stale status. Initially location is assigned to be stale since there is + * no gps fix at start up. The value changes in two places: + * 1- When [onStaleStateChange] is invoked, the value is updated based on the parameter + * 2- Whenever there is new gps fix it is set to be false + */ + private var isLocationStale = true + + internal var compassEngine: WassCompassEngine? = null + @CameraMode.Mode + private var lastCameraTrackingMode = CameraMode.TRACKING_COMPASS + private var cameraZoomLevelIndex = INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION + private var isDefaultCameraPositionInUse = false + + override fun onMapReady(mapboxMap: MapboxMap) { + map = mapboxMap.apply { + setStyle(Style.Builder() + .withImage(START_SYMBOL_ICON_ID, resources.getBitmapFromDrawable(R.drawable.ic_map_start_pin)) + .withImage(PAUSE_LINE_PATTERN, resources.getBitmapFromDrawable(R.drawable.ic_stale_track_dot)) + .fromUrl(context.getString(R.string.asoy_mapbox_style)) + ) { style -> + startLocationComponent(mapboxMap, style) + if (isBreadcrumbEnabled) { + breadcrumb = Breadcrumb(this@MapboxMapView, mapboxMap, style) + } + } + addOnMapLongClickListener(this@MapboxMapView) + addOnMapClickListener(this@MapboxMapView) + } + } + + // Location + @SuppressLint("MissingPermission") + private fun startLocationComponent(mapboxMap: MapboxMap, style: Style) { + mapboxMap.locationComponent.apply { + // Activate with options. If location engine is null, push location updates to + // the component without any internal engine management. No engine is going to + // be initialized and you can push location updates with + // [LocationComponent#forceLocationUpdate(Location)]. + activateLocationComponent( + context, + style, + null, + LocationComponentOptions.createFromAttributes(context, R.style.mapbox_location) + ) + compassEngine = this@MapboxMapView.compassEngine + addOnCameraTrackingChangedListener(this@MapboxMapView) + isLocationComponentEnabled = true + Timber.d("Mapbox Location Component is enabled") + addOnLocationStaleListener(this@MapboxMapView) + renderMode = RenderMode.GPS + cameraMode = lastCameraTrackingMode + } + } + + internal fun onNewLocation(location: Location) { + isLocationStale = false + map?.run { + getActivatedLocationComponent()?.run { + if (isDefaultCameraPositionInUse) { + updateMapCameraZoom(INITIAL_CAMERA_ZOOM_LEVEL_INDEX_WITH_LOCATION) + isDefaultCameraPositionInUse = false + } + forceLocationUpdate(location) + breadcrumb?.onNewLocation(location.latLong(), exerciseEngineState) + } + } + } + + override fun onStaleStateChange(isStale: Boolean) { + Timber.d("Location stale state change. Is Stale: $isStale") + isLocationStale = isStale + map?.getActivatedLocationComponent()?.run { + renderMode = if (isStale) RenderMode.NORMAL else RenderMode.GPS + val locationComponentStyle = if (isStale) R.style.mapbox_stale_location else R.style.mapbox_location + applyStyle(LocationComponentOptions.createFromAttributes(context, locationComponentStyle)) + } + } + + // Camera + private fun updateMapCameraZoom(zoomLevelIndex: Int) = map?.getActivatedLocationComponent()?.run { + cameraZoomLevelIndex = zoomLevelIndex + if (cameraMode != CameraMode.NONE) { + zoomWhileTracking(getCameraZoomLevel(), CAMERA_ANIMATION_DURATION) + } else { + map?.easeCamera(CameraUpdateFactory.zoomTo(getCameraZoomLevel())) + } + } + + private fun getCameraZoomLevel(): Double = map?.cameraPosition?.zoom ?: 0.0 + + override fun onCameraTrackingChanged(currentMode: Int) { + Timber.d("Camera tracking mode changed. Current mode: $currentMode") + if (map?.isCameraInTrackingMode() == true) { + lastCameraTrackingMode = currentMode + } + } + + /** + * Invoked whenever camera tracking is broken. + */ + override fun onCameraTrackingDismissed() { + Timber.d("Exiting from camera tracking mode") + updateCameraMode(CameraMode.NONE_COMPASS) + } + + private fun updateCameraMode(@CameraMode.Mode mode: Int) { + // We need to + map?.getActivatedLocationComponent()?.apply { + if (cameraMode != CameraMode.NONE) { + setCameraMode(mode, object : OnLocationCameraTransitionListener { + override fun onLocationCameraTransitionFinished(cameraMode: Int) { + zoomWhileTracking(getCameraZoomLevel(), CAMERA_ANIMATION_DURATION) + } + + override fun onLocationCameraTransitionCanceled(cameraMode: Int) { + // No impl. + } + }) + } else { + cameraMode = mode + } + } + } + + // Gestures + /** + * When [MapboxMap.OnMapClickListener.onMapClick] is called camera mode is updated: + * There are two camera tracking modes enabled: + * The [CameraMode.TRACKING_GPS_NORTH] sets the camera always to the north and the [CameraMode.TRACKING_COMPASS] + * sets the location indicator to north and map rotates according to heading + * If camera mode is [CameraMode.TRACKING_GPS_NORTH], onClick switches the mode to [CameraMode.TRACKING_COMPASS] + * If camera mode is [CameraMode.TRACKING_COMPASS] onClick switches the mode to [CameraMode.TRACKING_GPS_NORTH] + * If user starts panning while in tracking mode, camera switches to [CameraMode.NONE_COMPASS] mode and user is not + * tracked by camera. On click switches the camera back to last used tracking mode + */ + override fun onMapClick(point: LatLng): Boolean { + map?.getActivatedLocationComponent()?.apply { + when (cameraMode) { + CameraMode.TRACKING_GPS_NORTH -> updateCameraMode(CameraMode.TRACKING_COMPASS) + CameraMode.TRACKING_COMPASS -> updateCameraMode(CameraMode.TRACKING_GPS_NORTH) + CameraMode.NONE_COMPASS, + CameraMode.NONE, + CameraMode.NONE_GPS -> updateCameraMode(lastCameraTrackingMode) + else -> Timber.w("Using unsupported camera mode") + } + } + return true + } + + /** + * Used for mocking exercise pause / resmume controls + */ + override fun onMapLongClick(point: LatLng): Boolean { + if (exerciseEngineState == ExerciseEngineState.Paused) { + exerciseEngineState = ExerciseEngineState.Recording + } else if (exerciseEngineState == ExerciseEngineState.Recording) { + exerciseEngineState = ExerciseEngineState.Paused + } + return true + } + + /** + * By overriding this method, we prevent compass view component of the [MapView] from consuming the clicks + */ + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + super.onInterceptTouchEvent(ev) + return true + } + + override fun onResume() { + super.onResume() + breadcrumb?.onResume() + } + + override fun onStop() { + breadcrumb?.onStop() + super.onStop() + } + + override fun onDestroy() { + breadcrumb?.onDestroy() + super.onDestroy() + } +} diff --git a/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/ui/extensions/ConstraintLayoutExtensions.kt b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/ui/extensions/ConstraintLayoutExtensions.kt new file mode 100644 index 0000000000..84fa569e1b --- /dev/null +++ b/platform/android/wearapp/src/main/java/com/mapbox/mapboxsdk/wearapp/ui/extensions/ConstraintLayoutExtensions.kt @@ -0,0 +1,19 @@ +package com.example.mapbox.ui.extensions + +import android.support.constraint.ConstraintLayout +import android.support.constraint.ConstraintSet +import android.view.View + +fun ConstraintLayout.addViewAndMatchItToParent(view: View, zIndex: Int = 0) { + addView(view, zIndex) + ConstraintSet().run { + clone(this@addViewAndMatchItToParent) + view.run { + connect(id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP) + connect(id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START) + connect(id, ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END) + connect(id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM) + } + applyTo(this@addViewAndMatchItToParent) + } +} diff --git a/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_bg.xml b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_bg.xml new file mode 100644 index 0000000000..3c9d98734e --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_bg.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#000000" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12 0c6.627 0 12 5.373 12 12s-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0z"/> +</vector> diff --git a/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_bg_stale.xml b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_bg_stale.xml new file mode 100644 index 0000000000..b4a001cecc --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_bg_stale.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#80000000" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12 0c6.627 0 12 5.373 12 12s-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0z"/> +</vector> diff --git a/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_dark.xml b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_dark.xml new file mode 100644 index 0000000000..311d16a69a --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_dark.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#000000" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12 0c6.627 0 12 5.373 12 12s-5.373 12-12 12S0 18.627 0 12 5.373 0 12 0z"/> + <path android:fillColor="#FFFFFF" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12.044 3.67l5.782 14.773c0.053 0.142-0.099 0.278-0.233 0.208l-5.386-2.92-5.797 2.882a0.164 0.164 0 0 1-0.227-0.21L12.044 3.67z"/> +</vector> diff --git a/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_icon.xml b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_icon.xml new file mode 100644 index 0000000000..128bdf1ad1 --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_icon.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> + <path android:fillColor="#FFFFFF" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M12.044 3.67l5.782 14.773c0.053 0.142-0.099 0.278-0.233 0.208l-5.386-2.92-5.797 2.882a0.164 0.164 0 0 1-0.227-0.21L12.044 3.67z"/> +</vector> diff --git a/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_stale.xml b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_stale.xml new file mode 100644 index 0000000000..0f59ef0767 --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_map_location_indicator_stale.xml @@ -0,0 +1,3 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> + <path android:name="stale_icon" android:fillColor="#FFFFFF" android:pathData="M15.5234048,12.9703272 L19.6202888,17.0672112 L18.6922112,17.9952888 L6.00471117,5.30778883 L6.93278883,4.37971117 L11.0281757,8.47509808 L18.9589195,5.07632634 L15.5234048,12.9703272 Z M14.4298894,15.4829671 L12.3438817,20.2761199 C12.278246,20.4214306 12.0649298,20.4088271 12.0171947,20.256844 L10.174919,14.1018988 L3.74261709,11.9259455 C3.58971567,11.8755316 3.58001948,11.6657208 3.72844574,11.6034448 L8.50384064,9.55691829 L14.4298894,15.4829671 Z"/> +</vector> diff --git a/platform/android/wearapp/src/main/res/drawable/ic_map_start_pin.xml b/platform/android/wearapp/src/main/res/drawable/ic_map_start_pin.xml new file mode 100644 index 0000000000..b6b368a756 --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_map_start_pin.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="34dp" + android:height="70dp" + android:viewportWidth="34" + android:viewportHeight="70"> + + <path + android:fillColor="@color/base_red" + android:pathData="M 17 30 C 19.7614237492 30 22 32.2385762508 22 35 C 22 37.7614237492 19.7614237492 40 17 40 C 14.2385762508 40 12 37.7614237492 12 35 C 12 32.2385762508 14.2385762508 30 17 30 Z" /> + <path + android:fillColor="@color/base_black" + android:pathData="M 17 33 C 18.1045694997 33 19 33.8954305003 19 35 C 19 36.1045694997 18.1045694997 37 17 37 C 15.8954305003 37 15 36.1045694997 15 35 C 15 33.8954305003 15.8954305003 33 17 33 Z" /> + <path + android:fillColor="@color/base_black" + + android:pathData="M16.5,15 L2.5638852,15 C1.67236646,15 1.34908022,14.9071744 1.0231543,14.7328673 C0.697228371,14.5585602 0.441439796,14.3027716 0.267132704,13.9768457 C0.0928256111,13.6509198 4.01235366e-17,13.3276335 -6.90560205e-17,12.4361148 L6.90560205e-17,2.5638852 C-4.01235366e-17,1.67236646 0.0928256111,1.34908022 0.267132704,1.0231543 C0.441439796,0.697228371 0.697228371,0.441439796 1.0231543,0.267132704 C1.34908022,0.0928256111 1.67236646,6.01853049e-17 2.5638852,-1.03584031e-16 L31.4361148,1.03584031e-16 C32.3276335,-6.01853049e-17 32.6509198,0.0928256111 32.9768457,0.267132704 C33.3027716,0.441439796 33.5585602,0.697228371 33.7328673,1.0231543 C33.9071744,1.34908022 34,1.67236646 34,2.5638852 L34,12.4361148 C34,13.3276335 33.9071744,13.6509198 33.7328673,13.9768457 C33.5585602,14.3027716 33.3027716,14.5585602 32.9768457,14.7328673 C32.6509198,14.9071744 32.3276335,15 31.4361148,15 L17.5,15 L17.5,35 L16.5,35 L16.5,15 Z" /> + <path + android:fillColor="@color/base_white" + android:pathData="M7.8046875,8.5078125 C7.8046875,8.28645723 7.72656328,8.11653705 7.5703125,7.99804688 C7.41406172,7.8795567 7.13281453,7.75455795 6.7265625,7.62304688 C6.32031047,7.4915358 5.9986991,7.3619798 5.76171875,7.234375 C5.11588219,6.88541492 4.79296875,6.41536754 4.79296875,5.82421875 C4.79296875,5.51692555 4.87955643,5.24283975 5.05273438,5.00195312 C5.22591232,4.7610665 5.47460775,4.57291734 5.79882812,4.4375 C6.1230485,4.30208266 6.48697715,4.234375 6.890625,4.234375 C7.29687703,4.234375 7.65885258,4.30794197 7.9765625,4.45507812 C8.29427242,4.60221428 8.54101475,4.80989449 8.71679688,5.078125 C8.892579,5.34635551 8.98046875,5.65103996 8.98046875,5.9921875 L7.80859375,5.9921875 C7.80859375,5.73176953 7.72656332,5.5292976 7.5625,5.38476562 C7.39843668,5.24023365 7.16797023,5.16796875 6.87109375,5.16796875 C6.58463398,5.16796875 6.36197996,5.22851502 6.203125,5.34960938 C6.04427004,5.47070373 5.96484375,5.63020734 5.96484375,5.828125 C5.96484375,6.01302176 6.05794178,6.16796812 6.24414062,6.29296875 C6.43033947,6.41796938 6.70442527,6.5351557 7.06640625,6.64453125 C7.73307625,6.84505309 8.21874848,7.09374852 8.5234375,7.390625 C8.82812652,7.68750148 8.98046875,8.05728945 8.98046875,8.5 C8.98046875,8.99218996 8.7942727,9.37825381 8.421875,9.65820312 C8.0494773,9.93815244 7.54818023,10.078125 6.91796875,10.078125 C6.48046656,10.078125 6.08203305,9.99804768 5.72265625,9.83789062 C5.36327945,9.67773357 5.08919365,9.45833473 4.90039062,9.1796875 C4.7115876,8.90104027 4.6171875,8.57812684 4.6171875,8.2109375 L5.79296875,8.2109375 C5.79296875,8.8385448 6.167965,9.15234375 6.91796875,9.15234375 C7.19661598,9.15234375 7.41406172,9.09570369 7.5703125,8.98242188 C7.72656328,8.86914006 7.8046875,8.71093852 7.8046875,8.5078125 Z M14.0546875,5.26171875 L12.3125,5.26171875 L12.3125,10 L11.140625,10 L11.140625,5.26171875 L9.421875,5.26171875 L9.421875,4.3125 L14.0546875,4.3125 L14.0546875,5.26171875 Z M17.9335938,8.828125 L15.8789062,8.828125 L15.4882812,10 L14.2421875,10 L16.359375,4.3125 L17.4453125,4.3125 L19.5742188,10 L18.328125,10 L17.9335938,8.828125 Z M16.1953125,7.87890625 L17.6171875,7.87890625 L16.9023438,5.75 L16.1953125,7.87890625 Z M22.2109375,7.91796875 L21.2773438,7.91796875 L21.2773438,10 L20.1054688,10 L20.1054688,4.3125 L22.21875,4.3125 C22.8906284,4.3125 23.4088523,4.46223809 23.7734375,4.76171875 C24.1380227,5.06119941 24.3203125,5.48437227 24.3203125,6.03125 C24.3203125,6.41927277 24.236329,6.74283725 24.0683594,7.00195312 C23.9003898,7.261069 23.645835,7.46744715 23.3046875,7.62109375 L24.5351562,9.9453125 L24.5351562,10 L23.2773438,10 L22.2109375,7.91796875 Z M21.2773438,6.96875 L22.2226562,6.96875 C22.5169286,6.96875 22.7447909,6.89388096 22.90625,6.74414062 C23.0677091,6.59440029 23.1484375,6.38802215 23.1484375,6.125 C23.1484375,5.85676949 23.0722664,5.6458341 22.9199219,5.4921875 C22.7675774,5.3385409 22.5338557,5.26171875 22.21875,5.26171875 L21.2773438,5.26171875 L21.2773438,6.96875 Z M29.4921875,5.26171875 L27.75,5.26171875 L27.75,10 L26.578125,10 L26.578125,5.26171875 L24.859375,5.26171875 L24.859375,4.3125 L29.4921875,4.3125 L29.4921875,5.26171875 Z" /> +</vector>
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/res/drawable/ic_shape_north_indicator.xml b/platform/android/wearapp/src/main/res/drawable/ic_shape_north_indicator.xml new file mode 100644 index 0000000000..63d833e875 --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_shape_north_indicator.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="227dp" android:height="227dp" android:viewportWidth="227" android:viewportHeight="227"> + <path android:fillColor="#FF5640" android:fillType="evenOdd" android:strokeWidth="1" android:pathData="M106 15.25L113.5 4l7.5 11.25z"/> +</vector> diff --git a/platform/android/wearapp/src/main/res/drawable/ic_stale_track_dot.xml b/platform/android/wearapp/src/main/res/drawable/ic_stale_track_dot.xml new file mode 100644 index 0000000000..ac1af5c13f --- /dev/null +++ b/platform/android/wearapp/src/main/res/drawable/ic_stale_track_dot.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="8dp" + android:height="4dp" + android:viewportWidth="8" + android:viewportHeight="4"> + <path + android:fillColor="@color/base_red" + android:pathData="M 0 4 L 0 0 L 4 0 L 4 4 Z" /> +</vector>
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/res/layout/activity_main.xml b/platform/android/wearapp/src/main/res/layout/activity_main.xml index 87b06f944f..d944c444fa 100644 --- a/platform/android/wearapp/src/main/res/layout/activity_main.xml +++ b/platform/android/wearapp/src/main/res/layout/activity_main.xml @@ -1,15 +1,7 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:padding="@dimen/inner_frame_layout_padding"> - - <com.mapbox.mapboxsdk.maps.MapView - android:id="@+id/mapView" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - </com.mapbox.mapboxsdk.maps.MapView> - -</FrameLayout> +<android.support.constraint.ConstraintLayout + xmlns:tools="http://schemas.android.com/tools" + xmlns:android="http://schemas.android.com/apk/res/android" + tools:deviceIds="wear" + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent"/> diff --git a/platform/android/wearapp/src/main/res/values-round/strings.xml b/platform/android/wearapp/src/main/res/values-round/strings.xml deleted file mode 100644 index 452e3358d9..0000000000 --- a/platform/android/wearapp/src/main/res/values-round/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ -<resources> - <string name="hello_world">Hello Round World!</string> -</resources> diff --git a/platform/android/wearapp/src/main/res/values/colors.xml b/platform/android/wearapp/src/main/res/values/colors.xml new file mode 100644 index 0000000000..6d23e04896 --- /dev/null +++ b/platform/android/wearapp/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="map_accuracy">#1EB3EA</color> + <color name="base_black">#000000</color> + <color name="base_red">#ff5640</color> + <color name="base_white">#ffffff</color> +</resources>
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/res/values/dimens.xml b/platform/android/wearapp/src/main/res/values/dimens.xml index e865b412be..361a98b11d 100644 --- a/platform/android/wearapp/src/main/res/values/dimens.xml +++ b/platform/android/wearapp/src/main/res/values/dimens.xml @@ -1,15 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <!-- - Because the window insets on round devices are larger than 15dp, this padding only applies - to square screens. - --> - <dimen name="box_inset_layout_padding">0dp</dimen> - - <!-- - This padding applies to both square and round screens. The total padding between the buttons - and the window insets is box_inset_layout_padding (above variable) on square screens and - inner_frame_layout_padding (below variable) on round screens. - --> - <dimen name="inner_frame_layout_padding">5dp</dimen> + <dimen name="size_spacing_xxsmall">2dp</dimen> </resources> diff --git a/platform/android/wearapp/src/main/res/values/strings.xml b/platform/android/wearapp/src/main/res/values/strings.xml index 7f38b393f1..3a051a6df5 100644 --- a/platform/android/wearapp/src/main/res/values/strings.xml +++ b/platform/android/wearapp/src/main/res/values/strings.xml @@ -1,8 +1,9 @@ <resources> - <string name="app_name">WearApp</string> - <!-- - This string is used for square devices and overridden by hello_world in - values-round/strings.xml for round devices. - --> - <string name="hello_world">Hello Square World!</string> -</resources> + <string name="app_name">Maps Sample</string> + <string name="user_location_permission_explanation">Location permission needed</string> + <string name="user_location_permission_not_granted">Location permission not granted</string> + <string name="mapbox_api_key" translatable="false"> + sk.eyJ1IjoiYXNkaWdpdGFsIiwiYSI6ImNqb3JnbHJubzBkcWwzcXBoeHdhcWFxc3EifQ.vieGHep6o91dwji46TwOcw + </string> + <string name="asoy_mapbox_style" translatable="false">asset://map_style.json</string> +</resources>
\ No newline at end of file diff --git a/platform/android/wearapp/src/main/res/values/styles.xml b/platform/android/wearapp/src/main/res/values/styles.xml new file mode 100644 index 0000000000..eaba3be0ed --- /dev/null +++ b/platform/android/wearapp/src/main/res/values/styles.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Mapbox Location Component attributes --> + <style name="mapbox_location" parent="mapbox_location_common"> + <item name="mapbox_foregroundDrawable">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_backgroundDrawable">@drawable/ic_map_location_indicator_bg</item> + <item name="mapbox_bearingDrawable">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_gpsDrawable">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_foregroundDrawableStale">@drawable/ic_map_location_indicator_icon</item> + <item name="mapbox_backgroundDrawableStale">@drawable/ic_map_location_indicator_bg</item> + </style> + + <!-- Mapbox Location Component attributes when Rendering mode is GPS and location is stale --> + <style name="mapbox_stale_location" parent="mapbox_location_common"> + <item name="mapbox_foregroundDrawable">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_backgroundDrawable">@drawable/ic_map_location_indicator_bg_stale</item> + <item name="mapbox_bearingDrawable">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_gpsDrawable">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_foregroundDrawableStale">@drawable/ic_map_location_indicator_stale</item> + <item name="mapbox_backgroundDrawableStale">@drawable/ic_map_location_indicator_bg_stale</item> + </style> + + <style name="mapbox_location_common"> + <item name="mapbox_uiZoomGestures">false</item> + <item name="mapbox_uiCompass">false</item> + <item name="mapbox_uiAttribution">false</item> + <item name="mapbox_uiLogo">false</item> + <item name="mapbox_uiRotateGestures">false</item> + <item name="mapbox_accuracyAlpha">0.2</item> + <item name="mapbox_accuracyAnimationEnabled">true</item> + <item name="mapbox_accuracyColor">@color/map_accuracy</item> + <item name="mapbox_trackingGesturesManagement">true</item> + <item name="mapbox_renderTextureMode">true</item> + <item name="mapbox_enableStaleState">true</item> + <item name="mapbox_staleStateTimeout">2000</item> + </style> +</resources>
\ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..39cabe03ea --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':myapplication', ':mapbox', ':mapbox' |