diff --git a/WhirlyGlobe.podspec b/WhirlyGlobe.podspec
index 1502b87c72..df7dfa023f 100644
--- a/WhirlyGlobe.podspec
+++ b/WhirlyGlobe.podspec
@@ -26,25 +26,31 @@ Pod::Spec.new do |s|
s.source = { :git => 'https://github.com/mousebird/WhirlyGlobe.git', :branch => 'develop' }
- s.compiler_flags = '-D__USE_SDL_GLES__ -D__IPHONEOS__ -DSQLITE_OPEN_READONLY -DHAVE_PTHREAD=1 -DUNORDERED=1 -DLASZIPDLL_EXPORTS=1'
- s.xcconfig = { "HEADER_SEARCH_PATHS" => " \"$(PODS_ROOT)/WhirlyGlobe/common/local_libs/eigen/\" \"$(PODS_ROOT)/KissXML/KissXML/\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/nanopb/\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/clipper\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/lodepng\" \"$(SDKROOT)/usr/include/libxml2\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/glues/include/\" \"$(PODS_ROOT)/WhirlyGlobe/ios/library/WhirlyGlobe-MaplyComponent/include/private/\" \"$(PODS_ROOT)/WhirlyGlobe/ios/library/WhirlyGlobe-MaplyComponent/include/\" \"$(PODS_ROOT)/WhirlyGlobe/ios/library/WhirlyGlobe-MaplyComponent/include/vector_tiles/\" " }
+ s.compiler_flags = '-D__USE_SDL_GLES__ -D__IPHONEOS__ -DSQLITE_OPEN_READONLY -DHAVE_PTHREAD=1 -DUNORDERED=1 '
+ s.xcconfig = { "HEADER_SEARCH_PATHS" => " \"$(SDKROOT)/usr/include/libxml2\" \"$(PODS_ROOT)/KissXML/KissXML/\" \"$(PODS_ROOT)/WhirlyGlobe/common/local_libs/eigen/\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/nanopb/\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/clipper\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/lodepng\" \"${PODS_ROOT}/WhirlyGlobe/common/local_libs/glues/include/\" \"$(PODS_ROOT)/WhirlyGlobe/common/local_libs/GeographicLib/include/\" \"$(PODS_ROOT)/WhirlyGlobe/ios/library/WhirlyGlobe-MaplyComponent/include/private/\" \"$(PODS_ROOT)/WhirlyGlobe/ios/library/WhirlyGlobe-MaplyComponent/include/\" \"$(PODS_ROOT)/WhirlyGlobe/ios/library/WhirlyGlobe-MaplyComponent/include/vector_tiles/\" " }
s.default_subspec = 'MaplyComponent'
s.subspec 'locallibs' do |ll|
- ll.source_files = 'common/local_libs/aaplus/**/*.{h,cpp}',
+ ll.source_files =
+ 'common/local_libs/aaplus/**/*.{h,cpp}',
'common/local_libs/clipper/cpp/*.{cpp,hpp}',
'common/local_libs/shapefile/**/*.{c,h}',
'common/local_libs/lodepng/*.{cpp,h}',
- 'common/local_libs/nanopb/*.{c,h}'
- ll.preserve_paths = 'common/local_libs/laszip/include/laszip/*.h', 'common/local_libs/laszip/src/*.hpp',
- 'common/local_libs/eigen/Eigen/*', 'common/local_libs/eigen/Eigen/**/*.h',
+ 'common/local_libs/nanopb/*.{c,h}',
+ 'common/local_libs/GeographicLib/src/*.cpp'
+ ll.preserve_paths =
+ 'common/local_libs/eigen/Eigen/*',
+ 'common/local_libs/eigen/Eigen/**/*.h',
'common/local_libs/lodepng/*.h',
- 'common/local_libs/nanopb/*.h'
- ll.private_header_files = 'common/local_libs/aaplus/**/*.h',
+ 'common/local_libs/nanopb/*.h',
+ 'common/local_libs/GeographicLib/include/GeographicLib/*.{h,hpp}'
+ ll.private_header_files =
+ 'common/local_libs/aaplus/**/*.h',
'common/local_libs/clipper/cpp/*.hpp',
'common/local_libs/shapefile/**/*.h',
- 'common/local_libs/nanopb/*.h'
+ 'common/local_libs/nanopb/*.h',
+ 'common/local_libs/GeographicLib/include/GeographicLib/*.{h,hpp}'
end
s.subspec 'glues' do |gl|
@@ -54,9 +60,21 @@ Pod::Spec.new do |s|
end
s.subspec 'MaplyComponent' do |mc|
- mc.source_files = 'common/WhirlyGlobeLib/include/*.h', 'common/WhirlyGlobeLib/src/*.{c,cpp}', 'ios/library/WhirlyGlobeLib/src/*.{mm,m,cpp,metal}', 'ios/library/WhirlyGlobeLib/include/*.h', 'ios/library/WhirlyGlobe-MaplyComponent/include/**/*.h', 'ios/library/WhirlyGlobe-MaplyComponent/src/**/*.{mm,m,cpp,metal}'
- mc.public_header_files = 'ios/library/WhirlyGlobe-MaplyComponent/include/*.h', "ios/library/WhirlyGlobe-MaplyComponent/include/vector_tiles/*.h"
- mc.private_header_files = 'ios/library/WhirlyGlobeLib/include/*.h', 'ios/**/vector_tile.pb.h', 'ios/**/MaplyBridge.h'
+ mc.source_files =
+ 'common/WhirlyGlobeLib/include/*.h',
+ 'common/WhirlyGlobeLib/src/*.{c,cpp}',
+ 'ios/library/WhirlyGlobeLib/src/*.{mm,m,cpp,metal}',
+ 'ios/library/WhirlyGlobeLib/include/*.h',
+ 'ios/library/WhirlyGlobe-MaplyComponent/include/**/*.h',
+ 'ios/library/WhirlyGlobe-MaplyComponent/src/**/*.{mm,m,cpp,metal}'
+ mc.public_header_files =
+ 'ios/library/WhirlyGlobe-MaplyComponent/include/*.h',
+ "ios/library/WhirlyGlobe-MaplyComponent/include/vector_tiles/*.h",
+ 'ios/library/WhirlyGlobeLib/include/GeographicLib.h' # That we have to name it here means it probably belongs somewhere else...
+ mc.private_header_files =
+ 'ios/library/WhirlyGlobeLib/include/*.h',
+ 'ios/**/vector_tile.pb.h',
+ 'ios/**/MaplyBridge.h'
mc.dependency 'WhirlyGlobe/locallibs'
mc.dependency 'WhirlyGlobe/glues'
mc.dependency 'SMCalloutView'
diff --git a/android/apps/AutoTesterAndroid/app/build.gradle b/android/apps/AutoTesterAndroid/app/build.gradle
index 6aa7ac25c4..bfa924f14f 100644
--- a/android/apps/AutoTesterAndroid/app/build.gradle
+++ b/android/apps/AutoTesterAndroid/app/build.gradle
@@ -4,8 +4,11 @@ apply plugin: 'kotlin-android-extensions'
android {
compileOptions {
- sourceCompatibility 1.8
- targetCompatibility 1.8
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8
}
signingConfigs {
config {
@@ -18,7 +21,7 @@ android {
compileSdkVersion 28
defaultConfig {
applicationId "com.mousebirdconsulting.autotester"
- minSdkVersion 19
+ minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
diff --git a/android/apps/AutoTesterAndroid/app/src/debug/AndroidManifest.xml b/android/apps/AutoTesterAndroid/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000000..7c0c4e13fe
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/android/apps/AutoTesterAndroid/app/src/main/AndroidManifest.xml b/android/apps/AutoTesterAndroid/app/src/main/AndroidManifest.xml
index fffcf1ce0b..83b0cac4fa 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/AndroidManifest.xml
+++ b/android/apps/AutoTesterAndroid/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+
+
© MapTiler © OpenStreetMap contributors",
- "type":"vector"
- },
- "openmaptiles":{
- "type":"vector",
- "url":"https://api.maptiler.com/tiles/v3/tiles.json?key=MapTilerKey"
- }
- },
- "version":8,
- "zoom":1
-}
-
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_basic.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_basic.json
new file mode 120000
index 0000000000..2e12a2da9d
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_basic.json
@@ -0,0 +1 @@
+../../../../../../../resources/vectors/styles/maptiler_basic.json
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_expr_test.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_expr_test.json
new file mode 120000
index 0000000000..1770193a11
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_expr_test.json
@@ -0,0 +1 @@
+../../../../../../../resources/vectors/styles/maptiler_expr_test.json
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_hybrid_satellite.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_hybrid_satellite.json
new file mode 120000
index 0000000000..b6f5a4c3e6
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_hybrid_satellite.json
@@ -0,0 +1 @@
+../../../../../../../resources/vectors/styles/maptiler_hybrid_satellite.json
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_streets.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_streets.json
deleted file mode 100644
index 1e75f5ac0b..0000000000
--- a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_streets.json
+++ /dev/null
@@ -1,6630 +0,0 @@
-{
- "bearing":0,
- "center":[
- 0,
- 5.684341886080802e-14
- ],
- "glyphs":"https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key=MapTilerKey",
- "id":"streets",
- "layers":[
- {
- "id":"background",
- "layout":{
- "visibility":"visible"
- },
- "paint":{
- "background-color":{
- "stops":[
- [
- 6,
- "rgba(252, 247, 229, 1)"
- ],
- [
- 10,
- "rgba(252, 247, 229, 1)"
- ],
- [
- 14,
- "rgba(246, 241, 229, 1)"
- ],
- [
- 15,
- "rgba(246, 241, 229, 1)"
- ]
- ]
- }
- },
- "type":"background"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "crop"
- ]
- ],
- "id":"landcover_cropland",
- "layout":{
- "visibility":"visible"
- },
- "paint":{
- "fill-color":"rgba(243, 235, 195, 1)",
- "fill-opacity":{
- "base":1,
- "stops":[
- [
- 4,
- 1
- ],
- [
- 8,
- 0
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"globallandcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "grass"
- ]
- ],
- "id":"landcover_grassland",
- "paint":{
- "fill-color":"rgba(226, 236, 197, 1)",
- "fill-opacity":{
- "base":1,
- "stops":[
- [
- 4,
- 1
- ],
- [
- 8,
- 0
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"globallandcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "scrub"
- ]
- ],
- "id":"landcover_scrubland",
- "paint":{
- "fill-color":"rgba(199, 230, 179, 1)",
- "fill-opacity":{
- "base":1,
- "stops":[
- [
- 4,
- 1
- ],
- [
- 8,
- 0
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"globallandcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "tree"
- ]
- ],
- "id":"landcover_treeland",
- "paint":{
- "fill-color":"rgba(190, 222, 173, 1)",
- "fill-opacity":{
- "base":1,
- "stops":[
- [
- 4,
- 1
- ],
- [
- 8,
- 0
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"globallandcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "forest"
- ]
- ],
- "id":"landcover_forestland",
- "paint":{
- "fill-color":"rgba(171, 217, 170, 1)",
- "fill-opacity":{
- "base":1,
- "stops":[
- [
- 4,
- 1
- ],
- [
- 8,
- 0
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"globallandcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "snow"
- ]
- ],
- "id":"landcover_snowland",
- "layout":{
- "visibility":"visible"
- },
- "paint":{
- "fill-color":"hsl(0, 0%, 100%)",
- "fill-opacity":{
- "base":1,
- "stops":[
- [
- 4,
- 1
- ],
- [
- 8,
- 0
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"globallandcover",
- "type":"fill"
- },
- {
- "filter":[
- "all"
- ],
- "id":"park_outline",
- "layout":{
- "visibility":"visible"
- },
- "paint":{
- "line-color":"rgba(228, 241, 215, 1)",
- "line-dasharray":[
- 1,
- 1.5
- ],
- "line-opacity":1
- },
- "source":"openmaptiles",
- "source-layer":"park",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "residential",
- "suburbs",
- "neighbourhood"
- ]
- ],
- "id":"landuse_residential",
- "layout":{
- "visibility":"visible"
- },
- "maxzoom":24,
- "metadata":{
-
- },
- "paint":{
- "fill-color":{
- "base":1,
- "stops":[
- [
- 9,
- "rgba(233, 227, 210, 0.80)"
- ],
- [
- 12,
- "rgba(233, 227, 210, 0.55)"
- ],
- [
- 16,
- "rgba(233, 227, 210, 0.35)"
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "wood"
- ]
- ],
- "id":"landcover_wood",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-antialias":false,
- "fill-color":"hsla(98, 61%, 72%, 0.7)",
- "fill-opacity":0.4
- },
- "source":"openmaptiles",
- "source-layer":"landcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "grass"
- ]
- ],
- "id":"landcover_grass",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-antialias":false,
- "fill-color":"rgba(224, 232, 201, 1)",
- "fill-opacity":0.3
- },
- "source":"openmaptiles",
- "source-layer":"landcover",
- "type":"fill"
- },
- {
- "filter":[
- "==",
- "class",
- "cemetery"
- ],
- "id":"landuse_cemetery",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"hsl(75, 37%, 81%)"
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "==",
- "class",
- "hospital"
- ],
- "id":"landuse_hospital",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgba(249, 225, 220, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "==",
- "class",
- "school"
- ],
- "id":"landuse_school",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgb(236,238,204)"
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "stadium",
- "pitch",
- "track"
- ]
- ],
- "id":"landuse_stadium",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgb(236,238,204)"
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "garages"
- ]
- ],
- "id":"landuse_garages",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgba(236, 236, 236, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "dam"
- ]
- ],
- "id":"landuse_dam",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgba(209, 212, 190, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"landuse",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"waterway_tunnel",
- "layout":{
- "line-cap":"round",
- "visibility":"visible"
- },
- "minzoom":14,
- "paint":{
- "line-color":"#a0c8f0",
- "line-dasharray":[
- 2,
- 4
- ],
- "line-width":{
- "base":1.3,
- "stops":[
- [
- 13,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "river"
- ],
- [
- "!=",
- "brunnel",
- "tunnel"
- ],
- [
- "!=",
- "intermittent",
- 1
- ]
- ],
- "id":"waterway_river",
- "layout":{
- "line-cap":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#a0c8f0",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 11,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "river"
- ],
- [
- "!=",
- "brunnel",
- "tunnel"
- ],
- [
- "==",
- "intermittent",
- 1
- ]
- ],
- "id":"waterway_river_intermittent",
- "layout":{
- "line-cap":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#a0c8f0",
- "line-dasharray":[
- 3,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 11,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!=",
- "class",
- "river"
- ],
- [
- "!=",
- "brunnel",
- "tunnel"
- ],
- [
- "!=",
- "intermittent",
- 1
- ]
- ],
- "id":"waterway_other",
- "layout":{
- "line-cap":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#a0c8f0",
- "line-width":{
- "base":1.3,
- "stops":[
- [
- 13,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!=",
- "class",
- "river"
- ],
- [
- "!=",
- "brunnel",
- "tunnel"
- ],
- [
- "==",
- "intermittent",
- 1
- ]
- ],
- "id":"waterway_other_intermittent",
- "layout":{
- "line-cap":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#a0c8f0",
- "line-dasharray":[
- 4,
- 3
- ],
- "line-width":{
- "base":1.3,
- "stops":[
- [
- 13,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!=",
- "intermittent",
- 1
- ],
- [
- "!=",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"water",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgba(134, 204, 250, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"water",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "intermittent",
- 1
- ]
- ],
- "id":"water_intermittent",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-color":"rgba(172, 218, 251, 1)",
- "fill-opacity":0.85
- },
- "source":"openmaptiles",
- "source-layer":"water",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "sand"
- ]
- ],
- "id":"landcover_sand",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-antialias":false,
- "fill-color":"#f2e9ac",
- "fill-opacity":1
- },
- "source":"openmaptiles",
- "source-layer":"landcover",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "sand"
- ]
- ],
- "id":"landcover_sand_outline",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#f2e9ac",
- "line-width":2
- },
- "source":"openmaptiles",
- "source-layer":"landcover",
- "type":"line"
- },
- {
- "filter":[
- "==",
- "$type",
- "Polygon"
- ],
- "id":"aeroway_fill",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":11,
- "paint":{
- "fill-color":"rgba(229, 228, 224, 1)",
- "fill-opacity":0.7
- },
- "source":"openmaptiles",
- "source-layer":"aeroway",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "class",
- "runway"
- ]
- ],
- "id":"aeroway_runway",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":11,
- "paint":{
- "line-color":"#f0ede9",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 11,
- 3
- ],
- [
- 20,
- 16
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"aeroway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "class",
- "taxiway"
- ]
- ],
- "id":"aeroway_taxiway",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":11,
- "paint":{
- "line-color":"#f0ede9",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 11,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"aeroway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "ferry"
- ]
- ],
- "id":"ferry",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "paint":{
- "line-color":"rgba(108, 159, 182, 1)",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":1.1
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"tunnel_motorway_link_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-dasharray":[
- 0.5,
- 0.25
- ],
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 1
- ],
- [
- 13,
- 3
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "service",
- "track"
- ]
- ],
- "id":"tunnel_service_track_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#cfcdca",
- "line-dasharray":[
- 0.5,
- 0.25
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15,
- 1
- ],
- [
- 16,
- 4
- ],
- [
- 20,
- 11
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "ramp",
- "1"
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- ">",
- "layer",
- 0
- ]
- ],
- "id":"tunnel_link_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 1
- ],
- [
- 13,
- 3
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "street",
- "street_limited"
- ]
- ],
- "id":"tunnel_street_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#cfcdca",
- "line-opacity":{
- "stops":[
- [
- 12,
- 0
- ],
- [
- 12.5,
- 1
- ]
- ]
- },
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 0.5
- ],
- [
- 13,
- 1
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "secondary",
- "tertiary"
- ]
- ],
- "id":"tunnel_secondary_tertiary_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(195, 189, 187, 1)",
- "line-dasharray":[
- 0.5,
- 0.25
- ],
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 8,
- 1.5
- ],
- [
- 20,
- 17
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"tunnel_trunk_primary_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-dasharray":[
- 0.5,
- 0.25
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0.4
- ],
- [
- 6,
- 0.7
- ],
- [
- 7,
- 1.75
- ],
- [
- 20,
- 22
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"tunnel_motorway_casing",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-dasharray":[
- 0.5,
- 0.25
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0.4
- ],
- [
- 6,
- 0.7
- ],
- [
- 7,
- 1.75
- ],
- [
- 20,
- 22
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "path",
- "pedestrian"
- ]
- ],
- "id":"tunnel_path_pedestrian",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(204, 196, 176, 0.45)",
- "line-dasharray":[
- 1,
- 0.75
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 14,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway_link"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"tunnel_motorway_link",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fc8",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12.5,
- 0
- ],
- [
- 13,
- 1.5
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "service",
- "track"
- ]
- ],
- "id":"tunnel_service_track",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15.5,
- 0
- ],
- [
- 16,
- 2
- ],
- [
- 20,
- 7.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "service_construction",
- "track_construction"
- ]
- ],
- "id":"tunnel_service_track_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15.5,
- 0
- ],
- [
- 16,
- 2
- ],
- [
- 20,
- 7.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "ramp",
- "1"
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- ">",
- "layer",
- 0
- ]
- ],
- "id":"tunnel_link",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff4c6",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12.5,
- 0
- ],
- [
- 13,
- 1.5
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "minor"
- ]
- ],
- "id":"tunnel_minor",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 13.5,
- 0
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "minor_construction"
- ]
- ],
- "id":"tunnel_minor_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 13.5,
- 0
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "secondary",
- "tertiary"
- ]
- ],
- "id":"tunnel_secondary_tertiary",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(245, 245, 243, 1)",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 6.5,
- 0
- ],
- [
- 8,
- 0.5
- ],
- [
- 20,
- 13
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "secondary_construction",
- "tertiary_construction"
- ]
- ],
- "id":"tunnel_secondary_tertiary_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 6.5,
- 0
- ],
- [
- 8,
- 0.5
- ],
- [
- 20,
- 13
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"tunnel_trunk_primary",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff4c6",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "primary_construction",
- "trunk_construction"
- ]
- ],
- "id":"tunnel_trunk_primary_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff4c6",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"tunnel_motorway",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#ffdaa6",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway_construction"
- ],
- [
- "==",
- "brunnel",
- "tunnel"
- ]
- ],
- "id":"tunnel_motorway_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#ffdaa6",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "in",
- "class",
- "rail"
- ]
- ],
- "id":"tunnel_major_rail",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14,
- 0.4
- ],
- [
- 15,
- 0.75
- ],
- [
- 20,
- 2
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "tunnel"
- ],
- [
- "==",
- "class",
- "rail"
- ]
- ],
- "id":"tunnel_major_rail_hatching",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-dasharray":[
- 0.2,
- 8
- ],
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14.5,
- 0
- ],
- [
- 15,
- 3
- ],
- [
- 20,
- 8
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Polygon"
- ],
- [
- "==",
- "class",
- "pier"
- ]
- ],
- "id":"road_area_pier",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-antialias":true,
- "fill-color":"rgba(246, 241, 229, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "in",
- "class",
- "pier"
- ]
- ],
- "id":"road_pier",
- "layout":{
- "line-cap":"round",
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(246, 241, 229, 1)",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15,
- 1
- ],
- [
- 17,
- 4
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Polygon"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"road_area_bridge",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-antialias":true,
- "fill-color":"rgba(246, 241, 229, 0.6)"
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Polygon"
- ],
- [
- "!has",
- "brunnel"
- ],
- [
- "!in",
- "class",
- "bridge",
- "pier"
- ]
- ],
- "id":"road_area_pattern",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "fill-pattern":"pedestrian_polygon"
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "service",
- "track"
- ]
- ],
- "id":"road_service_track_casing",
- "layout":{
- "line-cap":"round",
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#cfcdca",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15,
- 1
- ],
- [
- 16,
- 4
- ],
- [
- 20,
- 11
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "!in",
- "class",
- "motorway",
- "trunk",
- "primary",
- "pedestrian",
- "path",
- "track",
- "service"
- ],
- [
- "==",
- "ramp",
- 1
- ]
- ],
- "id":"road_link_casing",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":13,
- "paint":{
- "line-color":"#e9ac77",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 1
- ],
- [
- 13,
- 3
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"road_trunk_primary_link_casing",
- "layout":{
- "line-cap":"butt",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 0.7
- ],
- [
- 20,
- 14
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "ramp",
- 1
- ]
- ],
- "id":"road_motorway_link_casing",
- "layout":{
- "line-cap":"butt",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":12,
- "paint":{
- "line-color":"#e9ac77",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 1
- ],
- [
- 13,
- 3
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "minor"
- ],
- [
- "!=",
- "ramp",
- "1"
- ]
- ],
- "id":"road_minor_casing",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#cfcdca",
- "line-opacity":{
- "stops":[
- [
- 12,
- 0
- ],
- [
- 12.5,
- 1
- ]
- ]
- },
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 0.5
- ],
- [
- 13,
- 1
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 20
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "secondary",
- "tertiary"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"road_secondary_tertiary_casing-copy",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(195, 189, 187, 1)",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 8,
- 1.5
- ],
- [
- 20,
- 17
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "!=",
- "ramp",
- 1
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"road_trunk_primary_casing",
- "layout":{
- "line-cap":"butt",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0.4
- ],
- [
- 6,
- 0.7
- ],
- [
- 7,
- 1.75
- ],
- [
- 20,
- 22
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"road_motorway_casing",
- "layout":{
- "line-cap":"butt",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":5,
- "paint":{
- "line-color":"#e9ac77",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0.4
- ],
- [
- 6,
- 0.7
- ],
- [
- 7,
- 1.75
- ],
- [
- 20,
- 22
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "path",
- "pedestrian"
- ]
- ],
- "id":"road_path_pedestrian",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":14,
- "paint":{
- "line-color":"rgba(204, 196, 176, 0.45)",
- "line-dasharray":[
- 1,
- 1
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 14,
- 1
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "!in",
- "class",
- "motorway",
- "trunk",
- "primary",
- "pedestrian",
- "path",
- "track",
- "service"
- ]
- ],
- "id":"road_link",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":13,
- "paint":{
- "line-color":"#fea",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12.5,
- 0
- ],
- [
- 13,
- 1.5
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"road_trunk_primary_link",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fea",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 0.5
- ],
- [
- 20,
- 10
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "ramp",
- 1
- ]
- ],
- "id":"road_motorway_link",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":12,
- "paint":{
- "line-color":"#fc8",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12.5,
- 0
- ],
- [
- 13,
- 1.5
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "service",
- "track"
- ]
- ],
- "id":"road_service_track",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15.5,
- 0
- ],
- [
- 16,
- 2
- ],
- [
- 20,
- 7.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "service_construction",
- "track_construction"
- ]
- ],
- "id":"road_service_track_construction",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15.5,
- 0
- ],
- [
- 16,
- 2
- ],
- [
- 20,
- 7.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "minor"
- ]
- ]
- ],
- "id":"road_minor",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 13.5,
- 0
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "minor_construction"
- ]
- ]
- ],
- "id":"road_minor_construction",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 13.5,
- 0
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "secondary",
- "tertiary"
- ]
- ],
- "id":"road_secondary_tertiary",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(245, 245, 243, 1)",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 6.5,
- 0
- ],
- [
- 8,
- 0.5
- ],
- [
- 20,
- 13
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "secondary_construction",
- "tertiary_construction"
- ]
- ],
- "id":"road_secondary_tertiary_construction",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 6.5,
- 0
- ],
- [
- 8,
- 0.5
- ],
- [
- 20,
- 13
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "!=",
- "ramp",
- 1
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"road_trunk_primary",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fea",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "!=",
- "ramp",
- 1
- ],
- [
- "in",
- "class",
- "primary_construction",
- "trunk_construction"
- ]
- ],
- "id":"road_trunk_primary_construction",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fea",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"road_motorway",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":5,
- "paint":{
- "line-color":{
- "base":1,
- "stops":[
- [
- 5,
- "hsl(26, 87%, 62%)"
- ],
- [
- 6,
- "#fc8"
- ]
- ]
- },
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "class",
- "motorway_construction"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"road_motorway_construction",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":5,
- "paint":{
- "line-color":{
- "base":1,
- "stops":[
- [
- 5,
- "hsl(26, 87%, 62%)"
- ],
- [
- 6,
- "#fc8"
- ]
- ]
- },
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "class",
- "rail"
- ]
- ],
- "id":"road_major_rail",
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14,
- 0.4
- ],
- [
- 15,
- 0.75
- ],
- [
- 20,
- 2
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "==",
- "class",
- "rail"
- ]
- ],
- "id":"road_major_rail_hatching",
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-dasharray":[
- 0.2,
- 8
- ],
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14.5,
- 0
- ],
- [
- 15,
- 3
- ],
- [
- 20,
- 8
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "subclass",
- "tram",
- "light_rail"
- ]
- ],
- "id":"road_minor_rail",
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14,
- 0.4
- ],
- [
- 15,
- 0.75
- ],
- [
- 20,
- 2
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "!in",
- "brunnel",
- "bridge",
- "tunnel"
- ],
- [
- "in",
- "subclass",
- "tram",
- "light_rail"
- ]
- ],
- "id":"road_minor_rail_hatching",
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-dasharray":[
- 0.2,
- 4
- ],
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14.5,
- 0
- ],
- [
- 15,
- 2
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "id":"building",
- "layout":{
- "visibility":"visible"
- },
- "maxzoom":14,
- "metadata":{
-
- },
- "minzoom":13,
- "paint":{
- "fill-color":"rgba(189, 185, 181, 0.3)",
- "fill-outline-color":{
- "base":1,
- "stops":[
- [
- 13,
- "hsla(35, 6%, 79%, 0.32)"
- ],
- [
- 14,
- "hsl(35, 6%, 79%)"
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"building",
- "type":"fill"
- },
- {
- "filter":[
- "all",
- [
- "!has",
- "hide_3d"
- ]
- ],
- "id":"building-3d",
- "layout":{
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":14,
- "paint":{
- "fill-extrusion-base":{
- "property":"render_min_height",
- "type":"identity"
- },
- "fill-extrusion-color":"rgba(189, 185, 181, 1)",
- "fill-extrusion-height":{
- "property":"render_height",
- "type":"identity"
- },
- "fill-extrusion-opacity":0.3
- },
- "source":"openmaptiles",
- "source-layer":"building",
- "type":"fill-extrusion"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"waterway-bridge-case",
- "layout":{
- "line-cap":"butt",
- "line-join":"miter"
- },
- "paint":{
- "line-color":"#bbbbbb",
- "line-gap-width":{
- "base":1.3,
- "stops":[
- [
- 13,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- },
- "line-width":{
- "base":1.6,
- "stops":[
- [
- 12,
- 0.5
- ],
- [
- 20,
- 5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"waterway-bridge",
- "layout":{
- "line-cap":"round",
- "line-join":"round"
- },
- "paint":{
- "line-color":"rgba(134, 204, 250, 1)",
- "line-width":{
- "base":1.3,
- "stops":[
- [
- 13,
- 0.5
- ],
- [
- 20,
- 6
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"waterway",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"bridge_motorway_link_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 1
- ],
- [
- 13,
- 3
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "service",
- "track"
- ]
- ],
- "id":"bridge_service_track_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#cfcdca",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15,
- 1
- ],
- [
- 16,
- 4
- ],
- [
- 20,
- 11
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "link"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"bridge_link_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 1
- ],
- [
- 13,
- 3
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 15
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "street",
- "street_limited"
- ]
- ],
- "id":"bridge_street_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"hsl(36, 6%, 74%)",
- "line-opacity":{
- "stops":[
- [
- 12,
- 0
- ],
- [
- 12.5,
- 1
- ]
- ]
- },
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12,
- 0.5
- ],
- [
- 13,
- 1
- ],
- [
- 14,
- 4
- ],
- [
- 20,
- 25
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "path",
- "pedestrian"
- ]
- ],
- "id":"bridge_path_pedestrian_casing",
- "layout":{
- "line-join":"miter",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"hsl(35, 6%, 80%)",
- "line-dasharray":[
- 1,
- 0
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 14,
- 1.5
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "secondary",
- "tertiary"
- ]
- ],
- "id":"bridge_secondary_tertiary_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(195, 189, 187, 1)",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 8,
- 1.5
- ],
- [
- 20,
- 17
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"bridge_trunk_primary_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0.4
- ],
- [
- 6,
- 0.7
- ],
- [
- 7,
- 1.75
- ],
- [
- 20,
- 22
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"bridge_motorway_casing",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#e9ac77",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0.4
- ],
- [
- 6,
- 0.7
- ],
- [
- 7,
- 1.75
- ],
- [
- 20,
- 22
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "path",
- "pedestrian"
- ]
- ],
- "id":"bridge_path_pedestrian",
- "metadata":{
-
- },
- "paint":{
- "line-color":"hsl(0, 0%, 100%)",
- "line-dasharray":[
- 1,
- 0.3
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 14,
- 0.5
- ],
- [
- 20,
- 10
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "ramp",
- 1
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"bridge_motorway_link",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fc8",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12.5,
- 0
- ],
- [
- 13,
- 1.5
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "service",
- "track"
- ]
- ],
- "id":"bridge_service_track",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15.5,
- 0
- ],
- [
- 16,
- 2
- ],
- [
- 20,
- 7.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "service_construction",
- "track_construction"
- ]
- ],
- "id":"bridge_service_track_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 15.5,
- 0
- ],
- [
- 16,
- 2
- ],
- [
- 20,
- 7.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "link"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"bridge_link",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fea",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 12.5,
- 0
- ],
- [
- 13,
- 1.5
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 11.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "minor"
- ]
- ],
- "id":"bridge_minor",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 13.5,
- 0
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "minor_construction"
- ]
- ],
- "id":"bridge_minor_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-opacity":1,
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 13.5,
- 0
- ],
- [
- 14,
- 2.5
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "secondary",
- "tertiary"
- ]
- ],
- "id":"bridge_secondary_tertiary",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"rgba(245, 245, 243, 1)",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 6.5,
- 0
- ],
- [
- 8,
- 0.5
- ],
- [
- 20,
- 13
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "secondary_construction",
- "tertiary_construction"
- ]
- ],
- "id":"bridge_secondary_tertiary_construction",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fff",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 6.5,
- 0
- ],
- [
- 8,
- 0.5
- ],
- [
- 20,
- 13
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "primary",
- "trunk"
- ]
- ],
- "id":"bridge_trunk_primary",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fea",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "in",
- "class",
- "primary_construction",
- "trunk_construction"
- ]
- ],
- "id":"bridge_trunk_primary_construction",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fea",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"bridge_motorway",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fc8",
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "motorway_construction"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ],
- [
- "!=",
- "ramp",
- 1
- ]
- ],
- "id":"bridge_motorway_construction",
- "layout":{
- "line-join":"round"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#fc8",
- "line-dasharray":[
- 2,
- 2
- ],
- "line-width":{
- "base":1.2,
- "stops":[
- [
- 5,
- 0
- ],
- [
- 7,
- 1
- ],
- [
- 20,
- 18
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "rail"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"bridge_major_rail",
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14,
- 0.4
- ],
- [
- 15,
- 0.75
- ],
- [
- 20,
- 2
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "rail"
- ],
- [
- "==",
- "brunnel",
- "bridge"
- ]
- ],
- "id":"bridge_major_rail_hatching",
- "metadata":{
-
- },
- "paint":{
- "line-color":"#bbb",
- "line-dasharray":[
- 0.2,
- 8
- ],
- "line-width":{
- "base":1.4,
- "stops":[
- [
- 14.5,
- 0
- ],
- [
- 15,
- 3
- ],
- [
- 20,
- 8
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "==",
- "class",
- "cable_car"
- ],
- "id":"cablecar",
- "layout":{
- "line-cap":"round",
- "visibility":"visible"
- },
- "minzoom":13,
- "paint":{
- "line-color":"hsl(0, 0%, 70%)",
- "line-width":{
- "base":1,
- "stops":[
- [
- 11,
- 1
- ],
- [
- 19,
- 2.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "==",
- "class",
- "cable_car"
- ],
- "id":"cablecar-dash",
- "layout":{
- "line-cap":"round",
- "visibility":"visible"
- },
- "minzoom":13,
- "paint":{
- "line-color":"hsl(0, 0%, 70%)",
- "line-dasharray":[
- 2,
- 3
- ],
- "line-width":{
- "base":1,
- "stops":[
- [
- 11,
- 3
- ],
- [
- 19,
- 5.5
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "admin_level",
- 3,
- 4
- ]
- ],
- "id":"boundary_3",
- "layout":{
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "line-color":"#9e9cab",
- "line-dasharray":[
- 5,
- 3
- ],
- "line-width":{
- "base":1,
- "stops":[
- [
- 4,
- 0.4
- ],
- [
- 5,
- 1
- ],
- [
- 12,
- 1.8
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"boundary",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "admin_level",
- 2
- ],
- [
- "!has",
- "claimed_by"
- ],
- [
- "==",
- "disputed",
- 0
- ]
- ],
- "id":"boundary_2_z0-4",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "maxzoom":5,
- "metadata":{
-
- },
- "minzoom":0,
- "paint":{
- "line-color":{
- "stops":[
- [
- 1,
- "rgba(145, 145, 145, 1)"
- ],
- [
- 6,
- "rgba(130, 130, 130, 1)"
- ]
- ]
- },
- "line-opacity":1,
- "line-width":{
- "base":1,
- "stops":[
- [
- 3,
- 1
- ],
- [
- 5,
- 1.2
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"boundary",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "admin_level",
- 2
- ],
- [
- "!has",
- "claimed_by"
- ],
- [
- "==",
- "disputed",
- 1
- ]
- ],
- "id":"boundary_2_z0-4_disputed",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "maxzoom":5,
- "metadata":{
-
- },
- "minzoom":0,
- "paint":{
- "line-color":"rgba(120, 120, 120, 1)",
- "line-dasharray":[
- 4,
- 3
- ],
- "line-opacity":1,
- "line-width":{
- "base":1,
- "stops":[
- [
- 3,
- 1
- ],
- [
- 5,
- 1.2
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"boundary",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "admin_level",
- 2
- ],
- [
- "==",
- "disputed",
- 0
- ]
- ],
- "id":"boundary_2_z5-",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":5,
- "paint":{
- "line-color":{
- "stops":[
- [
- 5,
- "rgba(120, 120, 120, 1)"
- ],
- [
- 12,
- "rgba(153, 153, 153, 1)"
- ]
- ]
- },
- "line-opacity":1,
- "line-width":{
- "base":1,
- "stops":[
- [
- 5,
- 1.2
- ],
- [
- 12,
- 3
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"boundary",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "admin_level",
- 2
- ],
- [
- "==",
- "disputed",
- 1
- ]
- ],
- "id":"boundary_2_z5-_disputed",
- "layout":{
- "line-cap":"round",
- "line-join":"round",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":5,
- "paint":{
- "line-color":{
- "stops":[
- [
- 5,
- "rgba(120, 120, 120, 1)"
- ],
- [
- 12,
- "rgba(153, 153, 153, 1)"
- ]
- ]
- },
- "line-dasharray":[
- 4,
- 3
- ],
- "line-opacity":1,
- "line-width":{
- "base":1,
- "stops":[
- [
- 5,
- 1.2
- ],
- [
- 12,
- 3
- ]
- ]
- }
- },
- "source":"openmaptiles",
- "source-layer":"boundary",
- "type":"line"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "LineString"
- ]
- ],
- "id":"water_name_line",
- "layout":{
- "symbol-placement":"line",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Regular",
- "Noto Sans Regular"
- ],
- "text-max-width":5,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":0,
- "paint":{
- "text-color":"#5d60be",
- "text-halo-color":"rgba(255,255,255,0.7)",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"water_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Point"
- ],
- [
- "!=",
- "class",
- "ocean"
- ]
- ],
- "id":"water_name_point",
- "layout":{
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Regular",
- "Noto Sans Regular"
- ],
- "text-max-width":5,
- "text-size":12,
- "visibility":"visible"
- },
- "maxzoom":24,
- "metadata":{
-
- },
- "minzoom":2,
- "paint":{
- "text-color":"rgba(76, 125, 173, 1)",
- "text-halo-color":"rgba(255,255,255,0)",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"water_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Point"
- ],
- [
- "==",
- "class",
- "ocean"
- ]
- ],
- "id":"water_ocean_name_point",
- "layout":{
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Regular",
- "Noto Sans Regular"
- ],
- "text-max-width":5,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":0,
- "paint":{
- "text-color":"rgba(76, 125, 173, 1)",
- "text-halo-color":"rgba(255,255,255,0)",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"water_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Point"
- ],
- [
- ">=",
- "rank",
- 20
- ],
- [
- "any",
- [
- "all",
- [
- "in",
- "class",
- "pitch"
- ],
- [
- "in",
- "subclass",
- "soccer",
- "tennis",
- "baseball",
- "basketball",
- "swimming",
- "golf"
- ]
- ]
- ],
- [
- "any",
- [
- "!has",
- "level"
- ],
- [
- "==",
- "level",
- 0
- ]
- ]
- ],
- "id":"poi_z16_subclass",
- "layout":{
- "icon-image":"{subclass}_11",
- "text-anchor":"top",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":9,
- "text-offset":[
- 0,
- 0.6
- ],
- "text-padding":2,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":16,
- "paint":{
- "text-color":"#666",
- "text-halo-blur":0.5,
- "text-halo-color":"#ffffff",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"poi",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Point"
- ],
- [
- ">=",
- "rank",
- 20
- ],
- [
- "none",
- [
- "all",
- [
- "in",
- "class",
- "pitch"
- ],
- [
- "in",
- "subclass",
- "soccer",
- "tennis",
- "baseball",
- "basketball",
- "swimming",
- "golf"
- ]
- ]
- ],
- [
- "any",
- [
- "!has",
- "level"
- ],
- [
- "==",
- "level",
- 0
- ]
- ]
- ],
- "id":"poi_z16",
- "layout":{
- "icon-image":"{class}_11",
- "text-anchor":"top",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":9,
- "text-offset":[
- 0,
- 0.6
- ],
- "text-padding":2,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":16,
- "paint":{
- "text-color":"#666",
- "text-halo-blur":0.5,
- "text-halo-color":"#ffffff",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"poi",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Point"
- ],
- [
- ">=",
- "rank",
- 7
- ],
- [
- "<",
- "rank",
- 20
- ],
- [
- "any",
- [
- "!has",
- "level"
- ],
- [
- "==",
- "level",
- 0
- ]
- ]
- ],
- "id":"poi_z15",
- "layout":{
- "icon-image":"{class}_11",
- "text-anchor":"top",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":9,
- "text-offset":[
- 0,
- 0.6
- ],
- "text-padding":2,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":15,
- "paint":{
- "text-color":"#666",
- "text-halo-blur":0.5,
- "text-halo-color":"#ffffff",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"poi",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "$type",
- "Point"
- ],
- [
- "any",
- [
- "<",
- "rank",
- 7
- ]
- ],
- [
- "any",
- [
- "!has",
- "level"
- ],
- [
- "==",
- "level",
- 0
- ]
- ]
- ],
- "id":"poi_z14",
- "layout":{
- "icon-image":"{class}_11",
- "icon-size":0.9,
- "text-anchor":"top",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":9,
- "text-offset":[
- 0,
- 0.6
- ],
- "text-padding":2,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":14.2,
- "paint":{
- "text-color":"#666",
- "text-halo-blur":0.5,
- "text-halo-color":"#ffffff",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"poi",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "bus",
- "railway",
- "airport"
- ],
- [
- "==",
- "subclass",
- "station"
- ]
- ],
- "id":"poi_transit",
- "layout":{
- "icon-image":"{class}_11",
- "icon-size":0.9,
- "text-anchor":"left",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":9,
- "text-offset":[
- 0.9,
- 0
- ],
- "text-padding":2,
- "text-size":12,
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "minzoom":15,
- "paint":{
- "text-color":"rgba(102, 102, 102, 1)",
- "text-halo-blur":0.5,
- "text-halo-color":"#ffffff",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"poi",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "oneway",
- 1
- ],
- [
- "in",
- "class",
- "motorway",
- "trunk",
- "primary",
- "secondary",
- "tertiary",
- "minor",
- "service"
- ]
- ],
- "id":"road_oneway",
- "layout":{
- "icon-image":"oneway",
- "icon-padding":2,
- "icon-rotate":90,
- "icon-rotation-alignment":"map",
- "icon-size":{
- "stops":[
- [
- 15,
- 0.5
- ],
- [
- 19,
- 1
- ]
- ]
- },
- "symbol-placement":"line",
- "symbol-spacing":75,
- "visibility":"visible"
- },
- "minzoom":15,
- "paint":{
- "icon-opacity":0.5
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "oneway",
- -1
- ],
- [
- "in",
- "class",
- "motorway",
- "trunk",
- "primary",
- "secondary",
- "tertiary",
- "minor",
- "service"
- ]
- ],
- "id":"road_oneway_opposite",
- "layout":{
- "icon-image":"oneway",
- "icon-padding":2,
- "icon-rotate":-90,
- "icon-rotation-alignment":"map",
- "icon-size":{
- "stops":[
- [
- 15,
- 0.5
- ],
- [
- 19,
- 1
- ]
- ]
- },
- "symbol-placement":"line",
- "symbol-spacing":75
- },
- "minzoom":15,
- "paint":{
- "icon-opacity":0.5
- },
- "source":"openmaptiles",
- "source-layer":"transportation",
- "type":"symbol"
- },
- {
- "filter":[
- "all"
- ],
- "id":"road_label",
- "layout":{
- "symbol-placement":"line",
- "text-anchor":"center",
- "text-field":"{name:latin} {name:nonlatin}",
- "text-font":[
- "Roboto Regular",
- "Noto Sans Regular"
- ],
- "text-offset":[
- 0,
- 0.15
- ],
- "text-size":{
- "base":1,
- "stops":[
- [
- 13,
- 12
- ],
- [
- 14,
- 13
- ]
- ]
- }
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#765",
- "text-halo-blur":0.5,
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"transportation_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "<=",
- "ref_length",
- 6
- ],
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "!in",
- "network",
- "us-interstate",
- "us-highway",
- "us-state"
- ]
- ],
- "id":"highway-shield",
- "layout":{
- "icon-image":"road_{ref_length}",
- "icon-rotation-alignment":"viewport",
- "icon-size":1,
- "symbol-avoid-edges":true,
- "symbol-placement":{
- "base":1,
- "stops":[
- [
- 10,
- "point"
- ],
- [
- 11,
- "line"
- ]
- ]
- },
- "symbol-spacing":200,
- "text-field":"{ref}",
- "text-font":[
- "Noto Sans Regular"
- ],
- "text-rotation-alignment":"viewport",
- "text-size":10
- },
- "minzoom":8,
- "paint":{
- "text-color":"rgba(37, 36, 36, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"transportation_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "<=",
- "ref_length",
- 6
- ],
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "in",
- "network",
- "us-interstate"
- ]
- ],
- "id":"highway-shield-us-interstate",
- "layout":{
- "icon-image":"{network}_{ref_length}",
- "icon-rotation-alignment":"viewport",
- "icon-size":1,
- "symbol-avoid-edges":true,
- "symbol-placement":{
- "base":1,
- "stops":[
- [
- 7,
- "point"
- ],
- [
- 7,
- "line"
- ],
- [
- 8,
- "line"
- ]
- ]
- },
- "symbol-spacing":200,
- "text-field":"{ref}",
- "text-font":[
- "Noto Sans Regular"
- ],
- "text-rotation-alignment":"viewport",
- "text-size":9
- },
- "minzoom":7,
- "paint":{
- "text-color":"rgba(255, 255, 255, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"transportation_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "<=",
- "ref_length",
- 6
- ],
- [
- "==",
- "$type",
- "LineString"
- ],
- [
- "in",
- "network",
- "us-highway",
- "us-state"
- ]
- ],
- "id":"highway-shield-us-other",
- "layout":{
- "icon-image":"{network}_{ref_length}",
- "icon-rotation-alignment":"viewport",
- "icon-size":1,
- "symbol-avoid-edges":true,
- "symbol-placement":{
- "base":1,
- "stops":[
- [
- 10,
- "point"
- ],
- [
- 11,
- "line"
- ]
- ]
- },
- "symbol-spacing":200,
- "text-field":"{ref}",
- "text-font":[
- "Noto Sans Regular"
- ],
- "text-rotation-alignment":"viewport",
- "text-size":9
- },
- "minzoom":9,
- "paint":{
- "text-color":"rgba(37, 36, 36, 1)"
- },
- "source":"openmaptiles",
- "source-layer":"transportation_name",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "has",
- "iata"
- ]
- ],
- "id":"airport-label-major",
- "layout":{
- "icon-image":"airport_11",
- "icon-size":1,
- "text-anchor":"top",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Noto Sans Regular"
- ],
- "text-max-width":9,
- "text-offset":[
- 0,
- 0.6
- ],
- "text-optional":true,
- "text-padding":2,
- "text-size":12,
- "visibility":"visible"
- },
- "minzoom":10,
- "paint":{
- "text-color":"#666",
- "text-halo-blur":0.5,
- "text-halo-color":"#ffffff",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"aerodrome_label",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "in",
- "class",
- "hamlet",
- "island",
- "islet",
- "neighbourhood",
- "suburb"
- ]
- ],
- "id":"place_other",
- "layout":{
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-letter-spacing":0.1,
- "text-max-width":9,
- "text-size":{
- "base":1.2,
- "stops":[
- [
- 12,
- 10
- ],
- [
- 15,
- 14
- ]
- ]
- },
- "text-transform":"uppercase",
- "visibility":"visible"
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"rgba(66, 62, 62, 1)",
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":1.2
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "village"
- ]
- ],
- "id":"place_village",
- "layout":{
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Regular",
- "Noto Sans Regular"
- ],
- "text-max-width":8,
- "text-size":{
- "base":1.2,
- "stops":[
- [
- 10,
- 12
- ],
- [
- 15,
- 22
- ]
- ]
- }
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#333",
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":1.2
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "town"
- ]
- ],
- "id":"place_town",
- "layout":{
- "icon-image":{
- "base":1,
- "stops":[
- [
- 0,
- "circle-stroked_16"
- ],
- [
- 10,
- ""
- ]
- ]
- },
- "text-anchor":"bottom",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Regular",
- "Noto Sans Regular"
- ],
- "text-max-width":8,
- "text-offset":[
- 0,
- 0
- ],
- "text-size":{
- "base":1.2,
- "stops":[
- [
- 7,
- 12
- ],
- [
- 11,
- 16
- ]
- ]
- }
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#333",
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":1.2
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "city"
- ]
- ],
- "id":"place_city",
- "layout":{
- "icon-allow-overlap":true,
- "icon-image":{
- "base":1,
- "stops":[
- [
- 0,
- "circle-stroked_16"
- ],
- [
- 10,
- ""
- ]
- ]
- },
- "icon-optional":false,
- "text-anchor":"bottom",
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Medium",
- "Noto Sans Regular"
- ],
- "text-max-width":8,
- "text-offset":[
- 0,
- 0
- ],
- "text-size":{
- "base":1.2,
- "stops":[
- [
- 7,
- 14
- ],
- [
- 11,
- 24
- ]
- ]
- }
- },
- "metadata":{
-
- },
- "minzoom":5,
- "paint":{
- "text-color":"#333",
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":1.2
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "state"
- ]
- ],
- "id":"state",
- "layout":{
- "text-field":"{name:latin}\n{name:nonlatin}",
- "text-font":[
- "Roboto Medium",
- "Noto Sans Regular"
- ],
- "text-letter-spacing":0.1,
- "text-padding":2,
- "text-size":{
- "stops":[
- [
- 4,
- 11
- ],
- [
- 6,
- 15
- ]
- ]
- },
- "text-transform":"uppercase"
- },
- "maxzoom":6,
- "metadata":{
-
- },
- "paint":{
- "text-color":"rgba(74, 72, 66, 1)",
- "text-halo-color":"rgba(255,255,255,0.7)",
- "text-halo-width":0.8
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "country"
- ],
- [
- "!has",
- "iso_a2"
- ]
- ],
- "id":"country_other",
- "layout":{
- "text-field":"{name:latin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":6.25,
- "text-size":{
- "stops":[
- [
- 3,
- 9
- ],
- [
- 7,
- 15
- ]
- ]
- },
- "text-transform":"none"
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#334",
- "text-halo-blur":1,
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":0.8
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- ">=",
- "rank",
- 3
- ],
- [
- "==",
- "class",
- "country"
- ],
- [
- "has",
- "iso_a2"
- ]
- ],
- "id":"country_3",
- "layout":{
- "text-field":"{name:latin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":6.25,
- "text-size":{
- "stops":[
- [
- 3,
- 11
- ],
- [
- 7,
- 17
- ]
- ]
- },
- "text-transform":"none"
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#334",
- "text-halo-blur":1,
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":0.8
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "rank",
- 2
- ],
- [
- "==",
- "class",
- "country"
- ],
- [
- "has",
- "iso_a2"
- ]
- ],
- "id":"country_2",
- "layout":{
- "text-field":"{name:latin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":6.25,
- "text-size":{
- "stops":[
- [
- 2,
- 11
- ],
- [
- 5,
- 17
- ]
- ]
- },
- "text-transform":"none"
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#334",
- "text-halo-blur":1,
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":0.8
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "rank",
- 1
- ],
- [
- "==",
- "class",
- "country"
- ],
- [
- "has",
- "iso_a2"
- ]
- ],
- "id":"country_1",
- "layout":{
- "text-field":"{name:latin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-max-width":6.25,
- "text-size":{
- "stops":[
- [
- 1,
- 11
- ],
- [
- 4,
- 17
- ]
- ]
- },
- "text-transform":"none"
- },
- "metadata":{
-
- },
- "paint":{
- "text-color":"#334",
- "text-halo-blur":1,
- "text-halo-color":"rgba(255,255,255,0.8)",
- "text-halo-width":0.8
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "filter":[
- "all",
- [
- "==",
- "class",
- "continent"
- ]
- ],
- "id":"continent",
- "layout":{
- "text-field":"{name:latin}",
- "text-font":[
- "Roboto Condensed Italic",
- "Noto Sans Italic"
- ],
- "text-justify":"center",
- "text-size":13,
- "text-transform":"uppercase"
- },
- "maxzoom":1,
- "metadata":{
-
- },
- "paint":{
- "text-color":"#633",
- "text-halo-color":"rgba(255,255,255,0.7)",
- "text-halo-width":1
- },
- "source":"openmaptiles",
- "source-layer":"place",
- "type":"symbol"
- },
- {
- "id":"housenumber",
- "layout":{
- "text-field":"{housenumber}",
- "text-font":[
- "Roboto Medium",
- "Noto Sans Regular"
- ],
- "text-size":10
- },
- "minzoom":17.5,
- "paint":{
- "text-color":"rgba(119, 102, 85, 0.69)"
- },
- "source":"openmaptiles",
- "source-layer":"housenumber",
- "type":"symbol"
- }
- ],
- "metadata":{
- "mapbox:type":"template",
- "maptiler:copyright":"This style was generated on MapTiler Cloud. Usage outside of MapTiler Cloud requires valid OpenMapTiles Production Package: https://openmaptiles.com/production-package/ -- please contact us.",
- "openmaptiles:version":"3.x"
- },
- "name":"Streets",
- "pitch":0,
- "sources":{
- "maptiler_attribution":{
- "attribution":"© MapTiler © OpenStreetMap contributors",
- "type":"vector"
- },
- "openmaptiles":{
- "type":"vector",
- "url":"https://api.maptiler.com/tiles/v3/tiles.json?key=MapTilerKey"
- }
- },
- "sprite":"https://api.maptiler.com/maps/streets/sprite",
- "version":8,
- "zoom":1.284245729371679
-}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_streets.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_streets.json
new file mode 120000
index 0000000000..74680cae56
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_streets.json
@@ -0,0 +1 @@
+../../../../../../../resources/vectors/styles/maptiler_streets.json
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_test_circles.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_test_circles.json
new file mode 120000
index 0000000000..7158f0971a
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_test_circles.json
@@ -0,0 +1 @@
+../../../../../../../resources/vectors/styles/maptiler_test_circles.json
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_topo.json b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_topo.json
new file mode 120000
index 0000000000..a2b539d656
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/maptiler_topo.json
@@ -0,0 +1 @@
+../../../../../../../resources/vectors/styles/maptiler_topo.json
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/mbtiles/overlay_obstacles.mbtiles b/android/apps/AutoTesterAndroid/app/src/main/assets/mbtiles/overlay_obstacles.mbtiles
new file mode 100644
index 0000000000..8a01237444
Binary files /dev/null and b/android/apps/AutoTesterAndroid/app/src/main/assets/mbtiles/overlay_obstacles.mbtiles differ
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/tall.png b/android/apps/AutoTesterAndroid/app/src/main/assets/tall.png
new file mode 100644
index 0000000000..7e397c1a66
Binary files /dev/null and b/android/apps/AutoTesterAndroid/app/src/main/assets/tall.png differ
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/wide.png b/android/apps/AutoTesterAndroid/app/src/main/assets/wide.png
new file mode 100644
index 0000000000..85add68593
Binary files /dev/null and b/android/apps/AutoTesterAndroid/app/src/main/assets/wide.png differ
diff --git a/android/apps/AutoTesterAndroid/app/src/main/assets/wide_vecs/line.geojson b/android/apps/AutoTesterAndroid/app/src/main/assets/wide_vecs/line.geojson
new file mode 100644
index 0000000000..3c5c0518c6
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/assets/wide_vecs/line.geojson
@@ -0,0 +1 @@
+{"type": "FeatureCollection", "features": [{"geometry": {"type": "MultiLineString", "coordinates": [[[-80.290556, 25.793333, 1247.9, 1409427928.0], [-122.309444, 47.448889, 1243.4, 1409427935.0]]]}, "type": "Feature", "properties": {"updated_date": "2014-09-03T22:56:12.674", "color": "#6750b4", "track_type": "", "time_created": "2014-09-03T22:55:18.016", "id": "bb7d9234f9b813b35527654c6aa46ccb", "title": "mowing lawn", "average_speed": 0, "stopped_time": null, "latitude": 46.03257254601325, "db_insert_date": "2014-09-03T22:55:18.016", "public": false, "moving_speed": 0, "revision": 3078, "total_time": null, "deleted": false, "is_active": true, "moving_time": 0, "flag": null, "preferred_link": "/public/eILNubIb6SvrfDEQ4JZUN205", "total_descent": null, "distance": 4043.36301379455, "notes": "", "longitude": -114.19690560964163, "total_ascent": null}}]}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Fragments/TestListFragment.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Fragments/TestListFragment.java
index 4d9d6597d2..a4350aeffe 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Fragments/TestListFragment.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Fragments/TestListFragment.java
@@ -1,5 +1,7 @@
package com.mousebirdconsulting.autotester.Fragments;
+import android.app.Activity;
+import android.content.Context;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
@@ -17,38 +19,12 @@
import com.mousebirdconsulting.autotester.Framework.MaplyTestCase;
import com.mousebirdconsulting.autotester.MainActivity;
import com.mousebirdconsulting.autotester.R;
-import com.mousebirdconsulting.autotester.TestCases.AnimatedBaseMapTestCase;
-import com.mousebirdconsulting.autotester.TestCases.AnimatedMarkersTestCase;
-import com.mousebirdconsulting.autotester.TestCases.AnimatedScreenMarkersTestCase;
-import com.mousebirdconsulting.autotester.TestCases.CartoTestCase;
-import com.mousebirdconsulting.autotester.TestCases.ClusteredMarkersTestCase;
-import com.mousebirdconsulting.autotester.TestCases.CustomBNGCoordAdapter;
-import com.mousebirdconsulting.autotester.TestCases.CustomBNGTileSource;
-//import com.mousebirdconsulting.autotester.TestCases.GreatCircleTestCase;
-import com.mousebirdconsulting.autotester.TestCases.FindHeightTestCase;
-import com.mousebirdconsulting.autotester.TestCases.GeographyClass;
-import com.mousebirdconsulting.autotester.TestCases.GreatCircleTestCase;
-import com.mousebirdconsulting.autotester.TestCases.ImageReloadTestCase;
-import com.mousebirdconsulting.autotester.TestCases.LoftedPolyTestCase;
-import com.mousebirdconsulting.autotester.TestCases.MapTilerTestCase;
-import com.mousebirdconsulting.autotester.TestCases.MarkersTestCase;
-import com.mousebirdconsulting.autotester.TestCases.OpenMapTilesHybridTestCase;
-import com.mousebirdconsulting.autotester.TestCases.PagingLayerTestCase;
-import com.mousebirdconsulting.autotester.TestCases.SLDTestCase;
-import com.mousebirdconsulting.autotester.TestCases.ScreenLabelsTestCase;
-import com.mousebirdconsulting.autotester.TestCases.ScreenMarkersTestCase;
-import com.mousebirdconsulting.autotester.TestCases.ShapefileTestCase;
-import com.mousebirdconsulting.autotester.TestCases.ShapesTestCase;
-import com.mousebirdconsulting.autotester.TestCases.StamenRemoteTestCase;
-import com.mousebirdconsulting.autotester.TestCases.StickersTestCase;
-import com.mousebirdconsulting.autotester.TestCases.TextureVectorTestCase;
-import com.mousebirdconsulting.autotester.TestCases.VectorHoleTestCase;
-import com.mousebirdconsulting.autotester.TestCases.VectorMBTilesTestCase;
-import com.mousebirdconsulting.autotester.TestCases.VectorStyleTestCase;
-import com.mousebirdconsulting.autotester.TestCases.VectorsTestCase;
-import com.mousebirdconsulting.autotester.TestCases.WideVectorsTestCase;
+import com.mousebirdconsulting.autotester.TestCases.*;
+
+import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
+import java.util.Objects;
public class TestListFragment extends Fragment {
@@ -76,7 +52,7 @@ public void onDestroyView() {
}
private RecyclerView.LayoutManager createLayoutManager() {
- return new LinearLayoutManager(getActivity().getApplicationContext());
+ return new LinearLayoutManager(Objects.requireNonNull(getActivity()).getApplicationContext());
}
public void changeItemsState(boolean selected) {
@@ -99,67 +75,74 @@ public void downloadResources() {
private class TestListAdapter extends RecyclerView.Adapter {
- private ArrayList testCases;
+ final private ArrayList testCases = new ArrayList<>();
TestListAdapter() {
- testCases = new ArrayList<>();
- testCases.add(new StamenRemoteTestCase(getActivity()));
- testCases.add(new GeographyClass(getActivity()));
- testCases.add(new AnimatedBaseMapTestCase(getActivity()));
- testCases.add(new ImageReloadTestCase(getActivity()));
- testCases.add(new CustomBNGCoordAdapter(getActivity()));
- testCases.add(new CustomBNGTileSource(getActivity()));
- testCases.add(new ScreenLabelsTestCase(getActivity()));
- testCases.add(new ScreenMarkersTestCase(getActivity()));
- testCases.add(new MarkersTestCase(getActivity()));
- testCases.add(new AnimatedScreenMarkersTestCase(getActivity()));
- testCases.add(new AnimatedMarkersTestCase(getActivity()));
- testCases.add(new ClusteredMarkersTestCase(getActivity()));
- testCases.add(new VectorsTestCase(getActivity()));
- testCases.add(new GreatCircleTestCase(getActivity()));
- testCases.add(new VectorStyleTestCase(getActivity()));
- testCases.add(new VectorHoleTestCase(getActivity()));
- testCases.add(new ShapefileTestCase(getActivity()));
- testCases.add(new WideVectorsTestCase(getActivity()));
- testCases.add(new TextureVectorTestCase(getActivity()));
- testCases.add(new SLDTestCase(getActivity()));
- testCases.add(new LoftedPolyTestCase(getActivity()));
- testCases.add(new StickersTestCase(getActivity()));
- testCases.add(new PagingLayerTestCase(getActivity()));
- testCases.add(new VectorMBTilesTestCase(getActivity()));
- testCases.add(new MapTilerTestCase(getActivity()));
- testCases.add(new OpenMapTilesHybridTestCase(getActivity()));
- testCases.add(new CartoTestCase(getActivity()));
- testCases.add(new ShapesTestCase(getActivity()));
+ Activity a = Objects.requireNonNull(getActivity());
+ testCases.add(new StamenRemoteTestCase(a));
+ testCases.add(new GeographyClass(a));
+ testCases.add(new AnimatedBaseMapTestCase(a));
+ testCases.add(new ImageReloadTestCase(a));
+ testCases.add(new CustomBNGCoordAdapter(a));
+ testCases.add(new CustomBNGTileSource(a));
+ testCases.add(new ScreenLabelsTestCase(a));
+ testCases.add(new ScreenMarkersTestCase(a));
+ testCases.add(new MarkersTestCase(a));
+ testCases.add(new AnimatedScreenMarkersTestCase(a));
+ testCases.add(new AnimatedMarkersTestCase(a));
+ testCases.add(new ClusteredMarkersTestCase(a));
+ testCases.add(new MovingScreenMarkersTestCase(a));
+ testCases.add(new VectorsTestCase(a));
+ testCases.add(new GreatCircleTestCase(a));
+ testCases.add(new SimpleStyleTestCase(a));
+ testCases.add(new VectorStyleTestCase(a));
+ testCases.add(new VectorHoleTestCase(a));
+ testCases.add(new ShapefileTestCase(a));
+ testCases.add(new WideVectorsTestCase(a));
+ testCases.add(new TextureVectorTestCase(a));
+ testCases.add(new SLDTestCase(a));
+ testCases.add(new LoftedPolyTestCase(a));
+ testCases.add(new StickersTestCase(a));
+ testCases.add(new PagingLayerTestCase(a));
+ testCases.add(new VectorMBTilesTestCase(a));
+ testCases.add(new MapTilerTestCase(a));
+ testCases.add(new MapTilerCircleTestCase(a));
+ testCases.add(new OpenMapTilesHybridTestCase(a));
+ testCases.add(new CartoTestCase(a));
+ testCases.add(new ShapesTestCase(a));
// Extruded Model (Arrows)
// Models
-// testCases.add(new MaplyStarModelTestCase(getActivity()));
- testCases.add(new FindHeightTestCase(getActivity()));
+// testCases.add(new MaplyStarModelTestCase(a));
+ testCases.add(new FindHeightTestCase(a));
// Animating Position
-// testCases.add(new GestureFeedbackTestCase(getActivity()));
-// testCases.add(new ComponentObjectLeakTestCase(getActivity()));
-// testCases.add(new LightingTestCase(getActivity()));
-// testCases.add( new BillboardTestCase(getActivity()));
-// testCases.add(new CoordConversionTestCase(getActivity()));
-// testCases.add(new StartupShutdownTestCase(getActivity()));
-// testCases.add(new MarkersAndLinesTestCase(getActivity()));
-// testCases.add(new BoundsTestCase(getActivity()));
-// testCases.add(new LayerShutdownTestCase(getActivity()));
-// testCases.add(new GeomPointsTestCase(getActivity()));
-// testCases.add(new AutoRotateTestCase(getActivity()));
-// testCases.add(new ArealTestCase(getActivity()));
+// testCases.add(new GestureFeedbackTestCase(a));
+// testCases.add(new ComponentObjectLeakTestCase(a));
+// testCases.add(new LightingTestCase(a));
+// testCases.add( new BillboardTestCase(a));
+// testCases.add(new CoordConversionTestCase(a));
+// testCases.add(new StartupShutdownTestCase(a));
+// testCases.add(new MarkersAndLinesTestCase(a));
+// testCases.add(new BoundsTestCase(a));
+// testCases.add(new LayerShutdownTestCase(a));
+// testCases.add(new GeomPointsTestCase(a));
+// testCases.add(new AutoRotateTestCase(a));
+// testCases.add(new ArealTestCase(a));
+ testCases.add(new LocationTrackingRealTestCase(a));
+ testCases.add(new LocationTrackingSimTestCase(a));
+ testCases.add(new GlobeRotationTestCase(a));
}
public void downloadResources() {
ArrayList incompleteTest = new ArrayList<>();
+ Context context = Objects.requireNonNull(getContext());
for (MaplyTestCase testCase : this.testCases) {
if (!testCase.areResourcesDownloaded()) {
incompleteTest.add(testCase);
- ConfigOptions.setTestState(getContext(), testCase.getTestName(), ConfigOptions.TestState.Downloading);
+ ConfigOptions.setTestState(context, testCase.getTestName(), ConfigOptions.TestState.Downloading);
} else {
- if (ConfigOptions.getTestState(getContext(), testCase.getTestName()) != ConfigOptions.TestState.Selected) {
- ConfigOptions.setTestState(getContext(), testCase.getTestName(), ConfigOptions.TestState.Ready);
+ if (ConfigOptions.getTestState(context, testCase.getTestName()) != ConfigOptions.TestState.Selected) {
+ ConfigOptions.setTestState(context, testCase.getTestName(), ConfigOptions.TestState.Ready);
}
}
adapter.notifyDataSetChanged();
@@ -202,14 +185,15 @@ public void onTestFinished(MaplyTestCase testCase) {
manager.execute();
}
+ @NotNull
@Override
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ public RecyclerView.ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.testlistitemview, parent, false);
return new TestViewHolder(view);
}
@Override
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ public void onBindViewHolder(@NotNull RecyclerView.ViewHolder holder, int position) {
((TestViewHolder) holder).bindViewHolder(testCases.get(position), position);
}
@@ -219,9 +203,10 @@ public int getItemCount() {
}
public void changeItemsState(boolean selected) {
+ Context context = Objects.requireNonNull(getContext());
for (MaplyTestCase testCase : testCases) {
ConfigOptions.TestState state = selected ? ConfigOptions.TestState.Ready : ConfigOptions.TestState.Selected;
- ConfigOptions.setTestState(getContext(), testCase.getTestName(), state);
+ ConfigOptions.setTestState(context, testCase.getTestName(), state);
}
notifyDataSetChanged();
}
@@ -233,10 +218,8 @@ public ArrayList getTestCases() {
private class TestViewHolder extends RecyclerView.ViewHolder {
- private TextView label;
- private ImageView selected, map, globe, retry, download;
- private View self;
- private MaplyTestCase testCase;
+ final private TextView label;
+ final private ImageView selected, map, globe, retry, download;
private int index;
public int getIndex() {
@@ -251,33 +234,29 @@ public TestViewHolder(View itemView) {
globe = (ImageView) itemView.findViewById(R.id.globe_icon);
retry = (ImageView) itemView.findViewById(R.id.retryDownload);
download = (ImageView) itemView.findViewById(R.id.downloading);
- self = itemView;
+ //self = itemView;
}
public void bindViewHolder(final MaplyTestCase testCase, final int index) {
- this.testCase = testCase;
+ //final private View self;
this.index = index;
- this.label.setText(this.testCase.getTestName());
- final MainActivity activity = (MainActivity) getActivity();
+ this.label.setText(testCase.getTestName());
+ final MainActivity activity = Objects.requireNonNull((MainActivity)getActivity());
+ final Context context = Objects.requireNonNull(getContext());
//if error
- switch (ConfigOptions.getTestState(getContext(), testCase.getTestName())) {
+ switch (ConfigOptions.getTestState(context, testCase.getTestName())) {
case Error:
- itemView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorRed));
+ itemView.setBackgroundColor(ContextCompat.getColor(activity, R.color.colorRed));
retry.setVisibility(View.VISIBLE);
selected.setVisibility(View.INVISIBLE);
map.setVisibility(View.INVISIBLE);
globe.setVisibility(View.INVISIBLE);
download.setVisibility(View.INVISIBLE);
- retry.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- adapter.downloadTestResources(index);
- }
- });
+ retry.setOnClickListener(v -> adapter.downloadTestResources(index));
break;
case Downloading:
- itemView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorGreen));
+ itemView.setBackgroundColor(ContextCompat.getColor(activity, R.color.colorGreen));
retry.setVisibility(View.INVISIBLE);
selected.setVisibility(View.INVISIBLE);
map.setVisibility(View.INVISIBLE);
@@ -289,58 +268,49 @@ public void onClick(View v) {
case Ready:
retry.setVisibility(View.INVISIBLE);
download.setVisibility(View.INVISIBLE);
- itemView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorWhite));
- switch (ConfigOptions.getExecutionMode(getContext())) {
+ itemView.setBackgroundColor(ContextCompat.getColor(activity, R.color.colorWhite));
+ switch (ConfigOptions.getExecutionMode(context)) {
case Multiple:
- changeItemState(ConfigOptions.getTestState(getContext(),testCase.getTestName()) == ConfigOptions.TestState.Selected);
+ changeItemState(ConfigOptions.getTestState(context,testCase.getTestName()) == ConfigOptions.TestState.Selected);
map.setVisibility(View.INVISIBLE);
globe.setVisibility(View.INVISIBLE);
- itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (ConfigOptions.getTestState(getContext(), testCase.getTestName()) == ConfigOptions.TestState.Ready){
- ConfigOptions.setTestState(getContext(), testCase.getTestName(), ConfigOptions.TestState.Selected);
- } else {
- ConfigOptions.setTestState(getContext(), testCase.getTestName(), ConfigOptions.TestState.Ready);
- }
- changeItemState(ConfigOptions.getTestState(getContext(),testCase.getTestName()) == ConfigOptions.TestState.Selected);
- notifyItemChanged(index);
+ itemView.setOnClickListener(v -> {
+ if (ConfigOptions.getTestState(context, testCase.getTestName()) == ConfigOptions.TestState.Ready){
+ ConfigOptions.setTestState(context, testCase.getTestName(), ConfigOptions.TestState.Selected);
+ } else {
+ ConfigOptions.setTestState(context, testCase.getTestName(), ConfigOptions.TestState.Ready);
}
+ changeItemState(ConfigOptions.getTestState(context,testCase.getTestName()) == ConfigOptions.TestState.Selected);
+ notifyItemChanged(index);
});
break;
case Interactive:
selected.setVisibility(View.INVISIBLE);
- if (this.testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Both || this.testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Map) {
+ if (testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Both || testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Map) {
map.setVisibility(View.VISIBLE);
}
else {
map.setVisibility(View.INVISIBLE);
}
- if (this.testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Both || this.testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Globe) {
+ if (testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Both || testCase.getImplementation() == MaplyTestCase.TestExecutionImplementation.Globe) {
globe.setVisibility(View.VISIBLE);
}
else {
globe.setVisibility(View.INVISIBLE);
}
- map.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ConfigOptions.setTestType(getContext(), ConfigOptions.TestType.MapTest);
- if (!activity.isExecuting()) {
- activity.prepareTest(testCase);
- activity.runTest(testCase);
- }
+ map.setOnClickListener(v -> {
+ ConfigOptions.setTestType(getContext(), ConfigOptions.TestType.MapTest);
+ if (!activity.isExecuting()) {
+ activity.prepareTest(testCase);
+ activity.runTest(testCase);
}
});
- globe.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ConfigOptions.setTestType(getContext(), ConfigOptions.TestType.GlobeTest);
- if (!activity.isExecuting()) {
- activity.prepareTest(testCase);
- activity.runTest(testCase);
- }
+ globe.setOnClickListener(v -> {
+ ConfigOptions.setTestType(getContext(), ConfigOptions.TestType.GlobeTest);
+ if (!activity.isExecuting()) {
+ activity.prepareTest(testCase);
+ activity.runTest(testCase);
}
});
break;
@@ -349,13 +319,10 @@ public void onClick(View v) {
selected.setVisibility(View.INVISIBLE);
map.setVisibility(View.INVISIBLE);
globe.setVisibility(View.INVISIBLE);
- itemView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!activity.isExecuting()) {
- activity.prepareTest(testCase);
- activity.runTest(testCase);
- }
+ itemView.setOnClickListener(v -> {
+ if (!activity.isExecuting()) {
+ activity.prepareTest(testCase);
+ activity.runTest(testCase);
}
});
break;
@@ -368,12 +335,11 @@ public void onClick(View v) {
globe.setVisibility(View.INVISIBLE);
retry.setVisibility(View.INVISIBLE);
download.setVisibility(View.INVISIBLE);
- switch (ConfigOptions.getExecutionMode(getContext())) {
+ switch (ConfigOptions.getExecutionMode(context)) {
case Multiple:
this.selected.setImageDrawable(getResources().getDrawable(R.drawable.ic_options_action));
break;
case Interactive:
- break;
case Single:
break;
}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Framework/MaplyTestCase.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Framework/MaplyTestCase.java
index 39e902fb84..0e4ddb10a0 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Framework/MaplyTestCase.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/Framework/MaplyTestCase.java
@@ -1,12 +1,15 @@
package com.mousebirdconsulting.autotester.Framework;
-
import android.app.Activity;
+import android.content.res.Resources;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Handler;
+import android.util.DisplayMetrics;
import android.util.Log;
+import android.view.Display;
import android.view.View;
+import android.view.WindowManager;
import com.mousebird.maply.GlobeController;
import com.mousebird.maply.MapController;
@@ -18,6 +21,7 @@
import com.mousebirdconsulting.autotester.ConfigOptions;
import com.mousebirdconsulting.autotester.R;
+import java.lang.ref.WeakReference;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
@@ -27,9 +31,7 @@
public class MaplyTestCase extends AsyncTask implements GlobeController.GestureDelegate, MapController.GestureDelegate {
- public enum TestExecutionImplementation {
- Globe, Map, Both, None;
- }
+ public enum TestExecutionImplementation { Globe, Map, Both, None }
public interface MaplyTestCaseListener {
void onStart(View view);
@@ -42,7 +44,7 @@ public interface MaplyTestCaseListener {
protected String testName;
protected int icon = R.drawable.ic_action_selectall;
protected ConfigOptions.TestType options;
- protected Activity activity;
+ protected WeakReference weakActivity;
protected BaseController controller;
protected GlobeController globeController;
protected MapController mapController;
@@ -55,12 +57,22 @@ public interface MaplyTestCaseListener {
public MaplyTestCase(Activity activity) {
super();
- this.activity = activity;
+ weakActivity = new WeakReference<>(activity);
+ }
+
+ public MaplyTestCase(Activity activity, String testName) {
+ this(activity, testName, TestExecutionImplementation.Both);
+ }
+
+ public MaplyTestCase(Activity activity, String testName, TestExecutionImplementation impl) {
+ this(activity);
+ this.testName = testName;
+ this.implementation = impl;
}
public boolean areResourcesDownloaded(){
for (int ii = 0; ii < remoteResources.size(); ii++){
- File file = new File(ConfigOptions.getCacheDir(activity) + "/" + getFileName(remoteResources.get(ii)));
+ File file = new File(ConfigOptions.getCacheDir(getActivity()) + "/" + getFileName(remoteResources.get(ii)));
if (!file.exists()){
return false;
}
@@ -80,7 +92,7 @@ public void downloadResources() {
}
private void downloadFromServer(String url) {
- String filename = ConfigOptions.getCacheDir(activity).getPath() + "/" + getFileName(url);
+ String filename = ConfigOptions.getCacheDir(getActivity()).getPath() + "/" + getFileName(url);
Log.e("Download", "Downloading " + url);
try {
@@ -111,10 +123,10 @@ private void downloadFromServer(String url) {
}
}
- private void deleteFile(String name){
+ private Boolean deleteFile(String name){
- File file = new File(ConfigOptions.getCacheDir(activity) + "/" + name);
- file.delete();
+ File file = new File(ConfigOptions.getCacheDir(getActivity()) + "/" + name);
+ return file.delete();
}
// Change this to set transparent backgrounds
int clearColor = Color.BLACK;
@@ -123,7 +135,7 @@ private void deleteFile(String name){
boolean success = false;
// Build the globe controller for use later
- // This can be overriden if we're doing something tricky
+ // This can be overridden if we're doing something tricky
protected GlobeController makeGlobeController()
{
GlobeController.Settings settings = new GlobeController.Settings();
@@ -132,26 +144,48 @@ protected GlobeController makeGlobeController()
settings.clearColor = clearColor;
// settings.width = 512;
// settings.height = 512;
- GlobeController globeControl = new GlobeController(activity,settings);
+ GlobeController globeControl = new GlobeController(getActivity(),settings);
globeControl.gestureDelegate = this;
return globeControl;
}
// Build the map controller for use later
- // This can be overriden if we're doing something tricky
+ // This can be overridden if we're doing something tricky
protected MapController makeMapController()
{
MapController.Settings settings = new MapController.Settings();
settings.clearColor = clearColor;
// settings.width = 512;
// settings.height = 512;
- MapController mapControl = new MapController(activity,settings);
+ MapController mapControl = new MapController(getActivity(),settings);
mapControl.gestureDelegate = this;
return mapControl;
}
+ /**
+ * Find the display DPI
+ */
+ public Point2d getDisplayDensity() {
+ Activity activity = getActivity();
+ WindowManager windowManager = (activity != null) ? activity.getWindowManager() : null;
+ Display display = (windowManager != null) ? windowManager.getDefaultDisplay() : null;
+ if (display != null) {
+ DisplayMetrics dm = new DisplayMetrics();
+ display.getRealMetrics(dm);
+ return new Point2d(dm.xdpi, dm.ydpi);
+ }
+ Resources resources = (activity != null) ? activity.getResources() : null;
+ if (resources != null) {
+ DisplayMetrics dm = resources.getDisplayMetrics();
+ if (dm != null) {
+ return new Point2d(dm.xdpi, dm.ydpi);
+ }
+ }
+ return null;
+ }
+
int numRuns = 0;
// If set we'll run startup/shutdown tests
boolean multiTest = false;
@@ -164,20 +198,11 @@ public void start()
startControl();
Handler handler = new Handler();
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- shutdown();
-
- Handler handler = new Handler();
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
-
- start();
- }
- }, runDelay);
- }
+ handler.postDelayed(() -> {
+ shutdown();
+
+ Handler handler1 = new Handler();
+ handler1.postDelayed(this::start, runDelay);
}, runDelay);
} else {
startControl();
@@ -205,12 +230,7 @@ public void startControl()
}
success = true;
listener.onStart(controller.getContentView());
- controller.addPostSurfaceRunnable(new Runnable() {
- @Override
- public void run() {
- implementationTest();
- }
- });
+ controller.addPostSurfaceRunnable(this::implementationTest);
}
private void implementationTest() {
@@ -247,35 +267,32 @@ protected void onPreExecute() {
protected Void doInBackground(Void... params) {
if (success) {
publishProgress(controller.getContentView());
- if (ConfigOptions.getExecutionMode(activity.getApplicationContext()) == ConfigOptions.ExecutionMode.Interactive) {
+ if (ConfigOptions.getExecutionMode(getActivity().getApplicationContext()) == ConfigOptions.ExecutionMode.Interactive) {
+ //noinspection InfiniteLoopStatement
while (true) {
try {
+ //noinspection BusyWait
Thread.sleep(500);
- } catch (InterruptedException e) {
+ } catch (InterruptedException ignored) {
}
}
}
- if (ConfigOptions.getViewSetting(activity.getApplicationContext()) == ConfigOptions.ViewMapOption.ViewMap) {
+ if (ConfigOptions.getViewSetting(getActivity().getApplicationContext()) == ConfigOptions.ViewMapOption.ViewMap) {
if (this.mapController != null && listener != null) {
try {
Thread.sleep(delay * 1000);
}
- catch (InterruptedException ex) {
+ catch (InterruptedException ignored) {
}
}
if (this.globeController != null && listener != null) {
if (options == ConfigOptions.TestType.BothTest) {
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- listener.onExecute(globeController.getContentView());
- }
- });
+ getActivity().runOnUiThread(() -> listener.onExecute(globeController.getContentView()));
}
try {
Thread.sleep(delay * 1000);
}
- catch (InterruptedException ex) {
+ catch (InterruptedException ignored) {
}
}
}
@@ -333,11 +350,11 @@ public void setIcon(int value) {
}
public Activity getActivity() {
- return activity;
+ return weakActivity.get();
}
public void setActivity(Activity value) {
- activity = value;
+ weakActivity = new WeakReference<>(value);
}
public String getTestName() {
@@ -352,9 +369,7 @@ public void setDelay(int value) {
delay = value;
}
- public int getDelay() {
- return delay;
- }
+ public int getDelay() { return delay; }
public TestExecutionImplementation getImplementation() {
return implementation;
@@ -370,12 +385,14 @@ public void userDidSelect(GlobeController globeControl, SelectedObject[] selObjs
public void userDidTap(GlobeController globeControl,Point2d loc,Point2d screenLoc)
{
- Log.d("Maply","User tapped at (" + loc.getX()*180/Math.PI + "," + loc.getY()*180/Math.PI + ") on screen (" + screenLoc.getX() + "," + screenLoc.getY() + ")");
- Point2d newScreenPt = globeControl.screenPointFromGeo(loc);
- Point2d newGeo = globeControl.geoPointFromScreen(newScreenPt);
+ Log.d("Maply", String.format("User tapped at screen(%f,%f) = geo(%f,%f)",
+ screenLoc.getX(), screenLoc.getY(), loc.getX()*180/Math.PI, loc.getY()*180/Math.PI));
+ //Point2d newScreenPt = globeControl.screenPointFromGeo(loc);
+ //Point2d newGeo = globeControl.geoPointFromScreen(newScreenPt);
Mbr mbr = globeControl.getCurrentViewGeo();
- if (mbr != null)
- Log.d("Maply","User is looking at bounding box: " + mbr);
+ if (mbr != null) {
+ Log.d("Maply", "User is looking at bounding box: " + mbr);
+ }
}
public void userDidTapOutside(GlobeController globeControl,Point2d screenLoc)
@@ -389,21 +406,21 @@ public void userDidLongPress(GlobeController globeControl, SelectedObject[] selO
public void globeDidStartMoving(GlobeController globeControl, boolean userMotion)
{}
- public void globeDidStopMoving(GlobeController globeControl, Point3d corners[], boolean userMotion)
+ public void globeDidStopMoving(GlobeController globeControl, Point3d[] corners, boolean userMotion)
{}
- public void globeDidMove(GlobeController globeControl,Point3d corners[], boolean userMotion)
+ public void globeDidMove(GlobeController globeControl,Point3d[] corners, boolean userMotion)
{}
public void mapDidStartMoving(MapController mapControl, boolean userMotion)
{}
- public void mapDidStopMoving(MapController mapControl, Point3d corners[], boolean userMotion)
+ public void mapDidStopMoving(MapController mapControl, Point3d[] corners, boolean userMotion)
{
}
- public void mapDidMove(MapController mapControl,Point3d corners[], boolean userMotion)
+ public void mapDidMove(MapController mapControl,Point3d[] corners, boolean userMotion)
{
}
@@ -418,9 +435,14 @@ public void userDidSelect(MapController mapControl,SelectedObject[] selObjs,Poin
public void userDidTap(MapController mapControl,Point2d loc,Point2d screenLoc)
{
- Log.d("Maply","User tapped at (" + loc.getX()*180/Math.PI + "," + loc.getY()*180/Math.PI + ") on screen (" + screenLoc.getX() + "," + screenLoc.getY() + ")");
- Point2d newScreenPt = mapControl.screenPointFromGeo(loc);
- Point2d newGeo = mapControl.geoPointFromScreen(newScreenPt);
+ Log.d("Maply", String.format("User tapped at screen(%f,%f) = geo(%f,%f)",
+ screenLoc.getX(), screenLoc.getY(), loc.getX()*180/Math.PI, loc.getY()*180/Math.PI));
+ //Point2d newScreenPt = mapControl.screenPointFromGeo(loc);
+ //Point2d newGeo = mapControl.geoPointFromScreen(newScreenPt);
+ Mbr mbr = mapControl.getCurrentViewGeo();
+ if (mbr != null) {
+ Log.d("Maply", "User is looking at bounding box: " + mbr);
+ }
}
public void userDidLongPress(MapController mapController, SelectedObject[] selObjs, Point2d loc, Point2d screenLoc)
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/ResultActivity.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/ResultActivity.java
index 3a69544d44..8da1aceeb4 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/ResultActivity.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/ResultActivity.java
@@ -34,6 +34,7 @@ protected void onCreate(Bundle savedInstanceState) {
try {
Bundle bundle = getIntent().getExtras();
+ @SuppressWarnings("unchecked") // we'll catch the cast exception if there's a problem
ArrayList listResults = (ArrayList) bundle.getSerializable("arraylist");
ResultsTestsAdapter adapter = new ResultsTestsAdapter(listResults, this);
resultsList.setAdapter(adapter);
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ClusteredMarkersTestCase.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ClusteredMarkersTestCase.java
index 59135885cd..00ae4e95ba 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ClusteredMarkersTestCase.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ClusteredMarkersTestCase.java
@@ -1,9 +1,8 @@
-/*
- * ClusteredMarkersTestCase.java
+/* ClusteredMarkersTestCase.java
* WhirlyGlobeLib
*
* Created by jmnavarro
- * Copyright 2011-2016 mousebird consulting
+ * Copyright 2011-2021 mousebird consulting
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +14,6 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- *
*/
package com.mousebirdconsulting.autotester.TestCases;
@@ -75,13 +73,12 @@ public boolean setUpWithGlobe(GlobeController globeVC) throws Exception {
private void insertClusteredMarkers(List vectors, BaseController inController) {
Point2d size = new Point2d(32, 32);
- List markers = new ArrayList<>();
+ List markers = new ArrayList<>(vectors.size());
Bitmap icon = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.sticker);
MaplyTexture tex = inController.addTexture(icon,new RenderController.TextureSettings(), RenderController.ThreadMode.ThreadCurrent);
// inController.addClusterGenerator(new BasicClusterGenerator(new int[]{Color.argb(165, 255, 255, 0)}, 1, new Point2d(64, 64), inController, inController.getActivity()));
- int which = 0;
for (VectorObject v : vectors) {
// Note: Increase this to test capacity
for (int ii=0;ii<1;ii++) {
@@ -90,15 +87,15 @@ private void insertClusteredMarkers(List vectors, BaseController i
marker.loc = v.centroid();
marker.size = size;
marker.selectable = true;
+ marker.layoutImportance = ii;
if (marker.loc != null)
markers.add(marker);
}
- which++;
}
MarkerInfo info = new MarkerInfo();
- info.setLayoutImportance(1.f);
+ //info.setLayoutImportance(1.f);
// info.setClusterGroup(1);
info.setClusterGroup(0);
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/CustomBNGCoordAdapter.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/CustomBNGCoordAdapter.java
index 150435ee84..35806bce58 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/CustomBNGCoordAdapter.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/CustomBNGCoordAdapter.java
@@ -50,7 +50,7 @@ protected MapController makeMapController()
MapController.Settings settings = new MapController.Settings();
settings.coordSys = coordSys;
- MapController mapControl = new MapController(activity,settings);
+ MapController mapControl = new MapController(getActivity(),settings);
mapControl.gestureDelegate = this;
return mapControl;
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/FindHeightTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/FindHeightTestCase.kt
index 6a7fb8d001..7635b84592 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/FindHeightTestCase.kt
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/FindHeightTestCase.kt
@@ -33,7 +33,7 @@ class FindHeightTestCase : MaplyTestCase {
val height = vc.findHeightToViewBounds(bbox, center)
vc.animatePositionGeo(center.x,center.y,height,1.0)
}
- }, 10000)
+ }, 1000)
}
var baseCase : MaplyTestCase? = null
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GeographyClass.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GeographyClass.java
index 15aa36991f..ee9edfb15e 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GeographyClass.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GeographyClass.java
@@ -133,7 +133,7 @@ private void setupImageLoader(BaseController baseController, String mbTilesName,
Log.d(TAG, String.format("Obtained MBTiles SQLLite database \"%s\"", mbTiles.getAbsolutePath()));
// The fetcher fetches tile from the MBTiles file
- MBTileFetcher mbTileFetcher = new MBTileFetcher(mbTiles);
+ MBTileFetcher mbTileFetcher = new MBTileFetcher(baseController, mbTiles);
if (mbTileFetcher == null)
return;
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GlobeRotationTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GlobeRotationTestCase.kt
new file mode 100644
index 0000000000..4aa87e00e4
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/GlobeRotationTestCase.kt
@@ -0,0 +1,50 @@
+/*
+ * GlobeRotationTestCase.kt
+ * WhirlyGlobeLib
+ *
+ * Created by Tim Sylvester on 9 Feb 2021.
+ * Copyright 2021 mousebird consulting
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.mousebirdconsulting.autotester.TestCases
+
+import android.app.Activity
+import com.mousebird.maply.GlobeController
+import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
+
+public class GlobeRotationTestCase : MaplyTestCase {
+
+ constructor(activity: Activity) : super(activity) {
+ testName = "Globe Rotation (#1286)"
+ implementation = TestExecutionImplementation.Globe
+
+ baseCase = VectorsTestCase(activity)
+ }
+
+ override fun setUpWithGlobe(globeVC: GlobeController?): Boolean {
+ if (!baseCase.setUpWithGlobe(globeVC)) {
+ return false
+ }
+ globeVC?.animatePositionGeo(0.0, Math.PI/8, 0.75, 0.0, 0.5)
+ return true
+ }
+
+ override fun shutdown() {
+ baseCase.shutdown()
+ super.shutdown()
+ }
+
+ private var baseCase: VectorsTestCase
+}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/LocationTrackingRealTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/LocationTrackingRealTestCase.kt
new file mode 100644
index 0000000000..cd46daa92a
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/LocationTrackingRealTestCase.kt
@@ -0,0 +1,155 @@
+package com.mousebirdconsulting.autotester.TestCases
+
+import android.Manifest
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.pm.PackageManager
+import android.graphics.Color
+import android.widget.Button
+import android.widget.FrameLayout
+import android.widget.LinearLayout
+import androidx.annotation.RequiresPermission
+import androidx.core.app.ActivityCompat
+import com.mousebird.maply.*
+import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
+import com.mousebirdconsulting.autotester.R
+
+open class LocationTrackingRealTestCase(activity: Activity) :
+ MaplyTestCase(activity, "Location Tracking - Real"),
+ LocationTrackerDelegate {
+
+ override fun onPreExecute() {
+
+ activity.findViewById(R.id.content_frame)?.let { frame ->
+
+ val lin = LinearLayout(activity)
+ lin.setBackgroundColor(Color.WHITE)
+ lin.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
+
+ val btnLayout = LinearLayout.LayoutParams(frame.width / 5, LinearLayout.LayoutParams.WRAP_CONTENT)
+
+ val noneBtn = Button(activity.applicationContext)
+ noneBtn.text = "No Lock"
+ noneBtn.layoutParams = btnLayout
+ noneBtn.textSize = frame.width / 120f
+ noneBtn.isAllCaps = false
+ noneBtn.setOnClickListener { _ -> onTrackNone() }
+ lin.addView(noneBtn)
+
+ val northBtn = Button(activity.applicationContext)
+ northBtn.text = "North Up"
+ northBtn.layoutParams = btnLayout
+ northBtn.textSize = frame.width / 120f
+ northBtn.isAllCaps = false
+ northBtn.setOnClickListener { _ -> onTrackNorth() }
+ lin.addView(northBtn)
+
+ val hdgBtn = Button(activity.applicationContext)
+ hdgBtn.text = "Heading Up"
+ hdgBtn.layoutParams = btnLayout
+ hdgBtn.textSize = frame.width / 120f
+ hdgBtn.isAllCaps = false
+ hdgBtn.setOnClickListener { _ -> onTrackHeading() }
+ lin.addView(hdgBtn)
+
+ val hdgFwdBtn = Button(activity.applicationContext)
+ hdgFwdBtn.text = "Heading Up Forward"
+ hdgFwdBtn.layoutParams = btnLayout
+ hdgFwdBtn.textSize = frame.width / 120f
+ hdgFwdBtn.isAllCaps = false
+ hdgFwdBtn.setOnClickListener { _ -> onTrackHeadingForward() }
+ lin.addView(hdgFwdBtn)
+
+ frame.addView(lin)
+ }
+ }
+
+ open fun setUp() {
+ val context = activity.applicationContext
+ if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
+ ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+
+ ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION), 0)
+ return
+ }
+
+ setUpTracker()
+ }
+
+ @RequiresPermission(anyOf = [Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION])
+ open fun setUpTracker() {
+ tracker?.stop()
+ tracker = null
+
+ val context = activity.applicationContext
+ baseViewC?.let { vc ->
+ tracker = LocationTracker(vc, this, useHeading = true).apply {
+ lockType = MaplyLocationLockType.MaplyLocationLockNorthUp
+ markerSize = 48
+ start(context)
+ }
+ }
+ }
+
+ // results of `ActivityCompat.requestPermissions`
+ @Suppress("UNUSED_PARAMETER")
+ @SuppressLint("MissingPermission")
+ fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: Array) {
+ if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
+ setUpTracker()
+ }
+ }
+
+ override fun setUpWithMap(mapVC: MapController?): Boolean {
+ baseViewC = mapVC
+ baseCase = CartoLightTestCase(getActivity()).apply {
+ setUpWithMap(mapVC)
+ }
+ mapVC?.setPositionGeo(-100 * Math.PI / 180.0, 40 * Math.PI / 180.0, 0.00005)
+ setUp()
+ return true
+ }
+
+ override fun setUpWithGlobe(globeVC: GlobeController?): Boolean {
+ baseViewC = globeVC
+ baseCase = CartoLightTestCase(getActivity()).apply {
+ setUpWithGlobe(globeVC)
+ }
+ globeVC?.keepNorthUp = false
+ globeVC?.setPositionGeo(-100 * Math.PI / 180.0, 40 * Math.PI / 180.0, 0.0001)
+ setUp()
+ return true
+ }
+
+ override fun shutdown() {
+ tracker?.stop()
+ tracker = null
+ super.shutdown()
+ }
+
+ private fun onTrackNone() {
+ tracker?.let {
+ it.lockType = MaplyLocationLockType.MaplyLocationLockNone
+ }
+ }
+ private fun onTrackNorth() {
+ tracker?.let {
+ it.lockType = MaplyLocationLockType.MaplyLocationLockNorthUp
+ }
+ }
+ private fun onTrackHeading() {
+ tracker?.let {
+ it.lockType = MaplyLocationLockType.MaplyLocationLockHeadingUp
+ }
+ }
+ private fun onTrackHeadingForward() {
+ tracker?.let {
+ it.lockType = MaplyLocationLockType.MaplyLocationLockHeadingUpOffset
+ it.forwardTrackOffset = 500
+ }
+ }
+
+ var baseCase: MaplyTestCase? = null
+ var baseViewC: BaseController? = null
+ var tracker: LocationTracker? = null
+}
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/LocationTrackingSimTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/LocationTrackingSimTestCase.kt
new file mode 100644
index 0000000000..9263386ea6
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/LocationTrackingSimTestCase.kt
@@ -0,0 +1,599 @@
+package com.mousebirdconsulting.autotester.TestCases
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.graphics.Color
+import com.mousebird.maply.LocationSimulatorDelegate
+import com.mousebird.maply.LocationTracker
+import com.mousebird.maply.LocationTrackerPoint
+import com.mousebird.maply.MaplyLocationLockType
+
+class LocationTrackingSimTestCase : LocationTrackingRealTestCase, LocationSimulatorDelegate {
+
+ constructor(activity: Activity) : super(activity)
+ {
+ setTestName("Location Tracking - Simulated")
+ implementation = TestExecutionImplementation.Both
+ }
+
+ @SuppressLint("MissingPermission")
+ override fun setUpTracker() {
+ tracker?.also {
+ it.stop()
+ }
+ tracker = null
+
+ val context = activity.applicationContext
+ baseViewC?.also { vc ->
+ tracker = LocationTracker(vc, this, this,
+ updateInterval = 1.0, useHeading = true).apply {
+ lockType = MaplyLocationLockType.MaplyLocationLockNorthUp
+ //markerColorInner = Color.YELLOW
+ markerColorOuter = Color.MAGENTA
+ //markerColorShadow = Color.argb(16, 0, 0, 255)
+ //markerColorOutline = Color.BLACK
+ //accuracyCircleColor = Color.argb(10, 0, 0, 0)
+ start(context)
+ }
+ }
+ }
+
+ override fun locationSimulatorGetLocation(): LocationTrackerPoint? {
+ markerSize = (markerSize + 3) % 250
+ tracker?.markerSize = markerSize
+ return if ((++simFailIndex % 20) != 0) convert(simPointData[simPointIndex++ % simPointData.size]) else null
+ }
+
+ private fun convert(p: Array): LocationTrackerPoint {
+ return LocationTrackerPoint().apply {
+ lonDeg = p[0]
+ latDeg = p[1]
+ headingDeg = p[2]
+ horizontalAccuracy = p[2] / 3
+ }
+ }
+
+ private var simPointIndex = 0
+ private var simFailIndex = 0
+ private var markerSize = 32
+ private val simPointData = arrayOf(
+ arrayOf(16.382910,48.211350,275.700000),
+ arrayOf(16.382870,48.211250,194.900000),
+ arrayOf(16.382830,48.211150,194.900000),
+ arrayOf(16.382797,48.211023,189.900000),
+ arrayOf(16.382763,48.210897,189.900000),
+ arrayOf(16.382730,48.210770,189.900000),
+ arrayOf(16.382705,48.210647,187.700000),
+ arrayOf(16.382680,48.210525,187.700000),
+ arrayOf(16.382655,48.210403,187.700000),
+ arrayOf(16.382630,48.210280,187.700000),
+ arrayOf(16.382600,48.210135,187.900000),
+ arrayOf(16.382570,48.209990,187.900000),
+ arrayOf(16.382520,48.209830,191.800000),
+ arrayOf(16.382484,48.209729,193.200000),
+ arrayOf(16.382449,48.209628,193.200000),
+ arrayOf(16.382413,48.209527,193.200000),
+ arrayOf(16.382378,48.209426,193.200000),
+ arrayOf(16.382342,48.209324,193.200000),
+ arrayOf(16.382307,48.209223,193.200000),
+ arrayOf(16.382271,48.209122,193.200000),
+ arrayOf(16.382236,48.209021,193.200000),
+ arrayOf(16.382200,48.208920,193.200000),
+ arrayOf(16.382115,48.208829,211.800000),
+ arrayOf(16.382030,48.208737,211.800000),
+ arrayOf(16.381945,48.208646,211.800000),
+ arrayOf(16.381860,48.208555,211.800000),
+ arrayOf(16.381775,48.208464,211.800000),
+ arrayOf(16.381690,48.208373,211.800000),
+ arrayOf(16.381605,48.208281,211.800000),
+ arrayOf(16.381520,48.208190,211.800000),
+ arrayOf(16.381437,48.208105,213.100000),
+ arrayOf(16.381354,48.208020,213.100000),
+ arrayOf(16.381271,48.207935,213.100000),
+ arrayOf(16.381188,48.207850,213.100000),
+ arrayOf(16.381105,48.207765,213.100000),
+ arrayOf(16.381022,48.207680,213.100000),
+ arrayOf(16.380939,48.207595,213.100000),
+ arrayOf(16.380856,48.207510,213.100000),
+ arrayOf(16.380773,48.207425,213.100000),
+ arrayOf(16.380690,48.207340,213.100000),
+ arrayOf(16.380565,48.207410,310.000000),
+ arrayOf(16.380440,48.207480,310.000000),
+ arrayOf(16.380320,48.207370,216.000000),
+ arrayOf(16.380170,48.207230,215.500000),
+ arrayOf(16.380320,48.207185,114.200000),
+ arrayOf(16.380470,48.207140,114.200000),
+ arrayOf(16.380383,48.207058,215.300000),
+ arrayOf(16.380297,48.206977,215.300000),
+ arrayOf(16.380210,48.206895,215.300000),
+ arrayOf(16.380123,48.206813,215.300000),
+ arrayOf(16.380037,48.206732,215.300000),
+ arrayOf(16.379950,48.206650,215.300000),
+ arrayOf(16.379860,48.206564,214.800000),
+ arrayOf(16.379770,48.206478,214.800000),
+ arrayOf(16.379680,48.206391,214.800000),
+ arrayOf(16.379590,48.206305,214.800000),
+ arrayOf(16.379500,48.206219,214.800000),
+ arrayOf(16.379410,48.206132,214.800000),
+ arrayOf(16.379320,48.206046,214.800000),
+ arrayOf(16.379230,48.205960,214.800000),
+ arrayOf(16.379127,48.205862,215.000000),
+ arrayOf(16.379025,48.205765,215.000000),
+ arrayOf(16.378923,48.205668,215.000000),
+ arrayOf(16.378820,48.205570,215.000000),
+ arrayOf(16.378730,48.205478,213.200000),
+ arrayOf(16.378640,48.205387,213.200000),
+ arrayOf(16.378550,48.205295,213.200000),
+ arrayOf(16.378460,48.205203,213.200000),
+ arrayOf(16.378370,48.205112,213.200000),
+ arrayOf(16.378280,48.205020,213.200000),
+ arrayOf(16.378185,48.204923,213.200000),
+ arrayOf(16.378090,48.204827,213.200000),
+ arrayOf(16.377995,48.204730,213.200000),
+ arrayOf(16.377900,48.204633,213.200000),
+ arrayOf(16.377805,48.204537,213.200000),
+ arrayOf(16.377710,48.204440,213.200000),
+ arrayOf(16.377620,48.204347,212.700000),
+ arrayOf(16.377530,48.204253,212.700000),
+ arrayOf(16.377440,48.204160,212.700000),
+ arrayOf(16.377350,48.204067,212.700000),
+ arrayOf(16.377260,48.203973,212.700000),
+ arrayOf(16.377170,48.203880,212.700000),
+ arrayOf(16.377050,48.203760,213.700000),
+ arrayOf(16.376930,48.203640,213.700000),
+ arrayOf(16.376823,48.203533,213.700000),
+ arrayOf(16.376717,48.203427,213.700000),
+ arrayOf(16.376610,48.203320,213.700000),
+ arrayOf(16.376570,48.203340,306.900000),
+ arrayOf(16.376350,48.203450,306.900000),
+ arrayOf(16.376258,48.203365,215.700000),
+ arrayOf(16.376167,48.203280,215.700000),
+ arrayOf(16.376075,48.203195,215.700000),
+ arrayOf(16.375983,48.203110,215.700000),
+ arrayOf(16.375892,48.203025,215.700000),
+ arrayOf(16.375800,48.202940,215.700000),
+ arrayOf(16.375706,48.202849,214.600000),
+ arrayOf(16.375611,48.202758,214.600000),
+ arrayOf(16.375517,48.202667,214.600000),
+ arrayOf(16.375422,48.202576,214.600000),
+ arrayOf(16.375328,48.202484,214.600000),
+ arrayOf(16.375233,48.202393,214.600000),
+ arrayOf(16.375139,48.202302,214.600000),
+ arrayOf(16.375044,48.202211,214.600000),
+ arrayOf(16.374950,48.202120,214.600000),
+ arrayOf(16.374810,48.202000,217.900000),
+ arrayOf(16.374680,48.201950,240.000000),
+ arrayOf(16.374550,48.201900,240.000000),
+ arrayOf(16.374387,48.201858,248.600000),
+ arrayOf(16.374225,48.201815,248.600000),
+ arrayOf(16.374063,48.201772,248.600000),
+ arrayOf(16.373900,48.201730,248.600000),
+ arrayOf(16.373890,48.201730,270.000000),
+ arrayOf(16.373695,48.201720,265.600000),
+ arrayOf(16.373500,48.201710,265.600000),
+ arrayOf(16.373353,48.201740,287.100000),
+ arrayOf(16.373207,48.201770,287.100000),
+ arrayOf(16.373060,48.201800,287.100000),
+ arrayOf(16.372917,48.201832,288.400000),
+ arrayOf(16.372774,48.201863,288.400000),
+ arrayOf(16.372631,48.201895,288.400000),
+ arrayOf(16.372488,48.201927,288.400000),
+ arrayOf(16.372345,48.201959,288.400000),
+ arrayOf(16.372202,48.201990,288.400000),
+ arrayOf(16.372059,48.202022,288.400000),
+ arrayOf(16.371916,48.202054,288.400000),
+ arrayOf(16.371773,48.202086,288.400000),
+ arrayOf(16.371630,48.202117,288.400000),
+ arrayOf(16.371487,48.202149,288.400000),
+ arrayOf(16.371343,48.202181,288.400000),
+ arrayOf(16.371200,48.202213,288.400000),
+ arrayOf(16.371057,48.202244,288.400000),
+ arrayOf(16.370914,48.202276,288.400000),
+ arrayOf(16.370771,48.202308,288.400000),
+ arrayOf(16.370628,48.202340,288.400000),
+ arrayOf(16.370485,48.202371,288.400000),
+ arrayOf(16.370342,48.202403,288.400000),
+ arrayOf(16.370199,48.202435,288.400000),
+ arrayOf(16.370056,48.202467,288.400000),
+ arrayOf(16.369913,48.202498,288.400000),
+ arrayOf(16.369770,48.202530,288.400000),
+ arrayOf(16.369610,48.202564,287.700000),
+ arrayOf(16.369450,48.202598,287.700000),
+ arrayOf(16.369290,48.202632,287.700000),
+ arrayOf(16.369130,48.202666,287.700000),
+ arrayOf(16.368970,48.202700,287.700000),
+ arrayOf(16.368822,48.202735,289.500000),
+ arrayOf(16.368673,48.202770,289.500000),
+ arrayOf(16.368525,48.202805,289.500000),
+ arrayOf(16.368377,48.202840,289.500000),
+ arrayOf(16.368228,48.202875,289.500000),
+ arrayOf(16.368080,48.202910,289.500000),
+ arrayOf(16.368020,48.202740,193.200000),
+ arrayOf(16.367872,48.202773,288.300000),
+ arrayOf(16.367724,48.202805,288.300000),
+ arrayOf(16.367576,48.202838,288.300000),
+ arrayOf(16.367428,48.202871,288.300000),
+ arrayOf(16.367280,48.202903,288.300000),
+ arrayOf(16.367132,48.202936,288.300000),
+ arrayOf(16.366984,48.202969,288.300000),
+ arrayOf(16.366836,48.203001,288.300000),
+ arrayOf(16.366688,48.203034,288.300000),
+ arrayOf(16.366540,48.203067,288.300000),
+ arrayOf(16.366392,48.203099,288.300000),
+ arrayOf(16.366244,48.203132,288.300000),
+ arrayOf(16.366096,48.203165,288.300000),
+ arrayOf(16.365948,48.203197,288.300000),
+ arrayOf(16.365800,48.203230,288.300000),
+ arrayOf(16.365657,48.203262,288.600000),
+ arrayOf(16.365513,48.203294,288.600000),
+ arrayOf(16.365370,48.203327,288.600000),
+ arrayOf(16.365227,48.203359,288.600000),
+ arrayOf(16.365083,48.203391,288.600000),
+ arrayOf(16.364940,48.203423,288.600000),
+ arrayOf(16.364797,48.203456,288.600000),
+ arrayOf(16.364653,48.203488,288.600000),
+ arrayOf(16.364510,48.203520,288.600000),
+ arrayOf(16.364350,48.203580,299.400000),
+ arrayOf(16.364226,48.203658,313.300000),
+ arrayOf(16.364102,48.203736,313.300000),
+ arrayOf(16.363978,48.203814,313.300000),
+ arrayOf(16.363854,48.203892,313.300000),
+ arrayOf(16.363730,48.203970,313.300000),
+ arrayOf(16.363628,48.204045,317.800000),
+ arrayOf(16.363525,48.204121,317.800000),
+ arrayOf(16.363423,48.204196,317.800000),
+ arrayOf(16.363321,48.204271,317.800000),
+ arrayOf(16.363218,48.204346,317.800000),
+ arrayOf(16.363116,48.204422,317.800000),
+ arrayOf(16.363014,48.204497,317.800000),
+ arrayOf(16.362911,48.204572,317.800000),
+ arrayOf(16.362809,48.204648,317.800000),
+ arrayOf(16.362706,48.204723,317.800000),
+ arrayOf(16.362604,48.204798,317.800000),
+ arrayOf(16.362502,48.204874,317.800000),
+ arrayOf(16.362399,48.204949,317.800000),
+ arrayOf(16.362297,48.205024,317.800000),
+ arrayOf(16.362195,48.205099,317.800000),
+ arrayOf(16.362092,48.205175,317.800000),
+ arrayOf(16.361990,48.205250,317.800000),
+ arrayOf(16.361889,48.205327,318.800000),
+ arrayOf(16.361788,48.205404,318.800000),
+ arrayOf(16.361686,48.205481,318.800000),
+ arrayOf(16.361585,48.205558,318.800000),
+ arrayOf(16.361484,48.205635,318.800000),
+ arrayOf(16.361383,48.205712,318.800000),
+ arrayOf(16.361282,48.205789,318.800000),
+ arrayOf(16.361181,48.205866,318.800000),
+ arrayOf(16.361079,48.205944,318.800000),
+ arrayOf(16.360978,48.206021,318.800000),
+ arrayOf(16.360877,48.206098,318.800000),
+ arrayOf(16.360776,48.206175,318.800000),
+ arrayOf(16.360675,48.206252,318.800000),
+ arrayOf(16.360574,48.206329,318.800000),
+ arrayOf(16.360472,48.206406,318.800000),
+ arrayOf(16.360371,48.206483,318.800000),
+ arrayOf(16.360270,48.206560,318.800000),
+ arrayOf(16.360162,48.206640,318.000000),
+ arrayOf(16.360054,48.206720,318.000000),
+ arrayOf(16.359946,48.206800,318.000000),
+ arrayOf(16.359838,48.206880,318.000000),
+ arrayOf(16.359730,48.206960,318.000000),
+ arrayOf(16.359680,48.207030,334.500000),
+ arrayOf(16.359685,48.207155,1.500000),
+ arrayOf(16.359690,48.207280,1.500000),
+ arrayOf(16.359727,48.207383,13.300000),
+ arrayOf(16.359763,48.207487,13.300000),
+ arrayOf(16.359800,48.207590,13.300000),
+ arrayOf(16.359837,48.207693,13.300000),
+ arrayOf(16.359873,48.207797,13.300000),
+ arrayOf(16.359910,48.207900,13.300000),
+ arrayOf(16.359944,48.207998,13.000000),
+ arrayOf(16.359977,48.208095,13.000000),
+ arrayOf(16.360011,48.208193,13.000000),
+ arrayOf(16.360045,48.208290,13.000000),
+ arrayOf(16.360079,48.208388,13.000000),
+ arrayOf(16.360112,48.208485,13.000000),
+ arrayOf(16.360146,48.208582,13.000000),
+ arrayOf(16.360180,48.208680,13.000000),
+ arrayOf(16.359950,48.208720,284.600000),
+ arrayOf(16.359796,48.208739,280.600000),
+ arrayOf(16.359641,48.208759,280.600000),
+ arrayOf(16.359487,48.208778,280.600000),
+ arrayOf(16.359333,48.208797,280.600000),
+ arrayOf(16.359179,48.208816,280.600000),
+ arrayOf(16.359024,48.208836,280.600000),
+ arrayOf(16.358870,48.208855,280.600000),
+ arrayOf(16.358716,48.208874,280.600000),
+ arrayOf(16.358561,48.208894,280.600000),
+ arrayOf(16.358407,48.208913,280.600000),
+ arrayOf(16.358253,48.208932,280.600000),
+ arrayOf(16.358099,48.208951,280.600000),
+ arrayOf(16.357944,48.208971,280.600000),
+ arrayOf(16.357790,48.208990,280.600000),
+ arrayOf(16.357755,48.208880,192.000000),
+ arrayOf(16.357720,48.208770,192.000000),
+ arrayOf(16.357685,48.208660,192.000000),
+ arrayOf(16.357650,48.208550,192.000000),
+ arrayOf(16.357610,48.208433,192.900000),
+ arrayOf(16.357570,48.208317,192.900000),
+ arrayOf(16.357530,48.208200,192.900000),
+ arrayOf(16.357370,48.208220,280.600000),
+ arrayOf(16.357210,48.208240,280.600000),
+ arrayOf(16.357050,48.208260,280.600000),
+ arrayOf(16.356890,48.208280,280.600000),
+ arrayOf(16.356730,48.208300,280.600000),
+ arrayOf(16.356570,48.208320,280.600000),
+ arrayOf(16.356410,48.208344,282.900000),
+ arrayOf(16.356250,48.208369,282.900000),
+ arrayOf(16.356090,48.208393,282.900000),
+ arrayOf(16.355930,48.208418,282.900000),
+ arrayOf(16.355770,48.208442,282.900000),
+ arrayOf(16.355610,48.208467,282.900000),
+ arrayOf(16.355450,48.208491,282.900000),
+ arrayOf(16.355290,48.208516,282.900000),
+ arrayOf(16.355130,48.208540,282.900000),
+ arrayOf(16.355115,48.208660,355.200000),
+ arrayOf(16.355100,48.208780,355.200000),
+ arrayOf(16.355122,48.208887,7.700000),
+ arrayOf(16.355143,48.208993,7.700000),
+ arrayOf(16.355165,48.209100,7.700000),
+ arrayOf(16.355187,48.209207,7.700000),
+ arrayOf(16.355208,48.209313,7.700000),
+ arrayOf(16.355230,48.209420,7.700000),
+ arrayOf(16.355255,48.209530,8.600000),
+ arrayOf(16.355280,48.209640,8.600000),
+ arrayOf(16.355305,48.209750,8.600000),
+ arrayOf(16.355330,48.209860,8.600000),
+ arrayOf(16.355355,48.209970,8.600000),
+ arrayOf(16.355380,48.210080,8.600000),
+ arrayOf(16.355405,48.210190,8.600000),
+ arrayOf(16.355430,48.210300,8.600000),
+ arrayOf(16.355456,48.210402,9.600000),
+ arrayOf(16.355482,48.210504,9.600000),
+ arrayOf(16.355508,48.210606,9.600000),
+ arrayOf(16.355534,48.210708,9.600000),
+ arrayOf(16.355560,48.210810,9.600000),
+ arrayOf(16.355585,48.210918,8.800000),
+ arrayOf(16.355610,48.211026,8.800000),
+ arrayOf(16.355635,48.211134,8.800000),
+ arrayOf(16.355660,48.211242,8.800000),
+ arrayOf(16.355685,48.211350,8.800000),
+ arrayOf(16.355710,48.211458,8.800000),
+ arrayOf(16.355735,48.211566,8.800000),
+ arrayOf(16.355760,48.211674,8.800000),
+ arrayOf(16.355785,48.211782,8.800000),
+ arrayOf(16.355810,48.211890,8.800000),
+ arrayOf(16.355836,48.211997,9.100000),
+ arrayOf(16.355861,48.212103,9.100000),
+ arrayOf(16.355887,48.212210,9.100000),
+ arrayOf(16.355912,48.212317,9.100000),
+ arrayOf(16.355938,48.212423,9.100000),
+ arrayOf(16.355963,48.212530,9.100000),
+ arrayOf(16.355989,48.212637,9.100000),
+ arrayOf(16.356014,48.212743,9.100000),
+ arrayOf(16.356040,48.212850,9.100000),
+ arrayOf(16.356064,48.212958,8.400000),
+ arrayOf(16.356088,48.213066,8.400000),
+ arrayOf(16.356112,48.213174,8.400000),
+ arrayOf(16.356136,48.213282,8.400000),
+ arrayOf(16.356160,48.213390,8.400000),
+ arrayOf(16.356187,48.213500,9.300000),
+ arrayOf(16.356214,48.213610,9.300000),
+ arrayOf(16.356241,48.213720,9.300000),
+ arrayOf(16.356269,48.213830,9.300000),
+ arrayOf(16.356296,48.213940,9.300000),
+ arrayOf(16.356323,48.214050,9.300000),
+ arrayOf(16.356350,48.214160,9.300000),
+ arrayOf(16.356397,48.214273,15.300000),
+ arrayOf(16.356443,48.214387,15.300000),
+ arrayOf(16.356490,48.214500,15.300000),
+ arrayOf(16.356280,48.214550,289.700000),
+ arrayOf(16.356310,48.214580,33.700000),
+ arrayOf(16.356467,48.214551,105.500000),
+ arrayOf(16.356624,48.214522,105.500000),
+ arrayOf(16.356781,48.214493,105.500000),
+ arrayOf(16.356938,48.214464,105.500000),
+ arrayOf(16.357095,48.214435,105.500000),
+ arrayOf(16.357252,48.214406,105.500000),
+ arrayOf(16.357409,48.214377,105.500000),
+ arrayOf(16.357566,48.214348,105.500000),
+ arrayOf(16.357723,48.214319,105.500000),
+ arrayOf(16.357880,48.214290,105.500000),
+ arrayOf(16.358033,48.214265,103.800000),
+ arrayOf(16.358185,48.214240,103.800000),
+ arrayOf(16.358338,48.214215,103.800000),
+ arrayOf(16.358490,48.214190,103.800000),
+ arrayOf(16.358643,48.214165,103.800000),
+ arrayOf(16.358795,48.214140,103.800000),
+ arrayOf(16.358948,48.214115,103.800000),
+ arrayOf(16.359100,48.214090,103.800000),
+ arrayOf(16.359252,48.214062,105.500000),
+ arrayOf(16.359404,48.214034,105.500000),
+ arrayOf(16.359556,48.214006,105.500000),
+ arrayOf(16.359708,48.213978,105.500000),
+ arrayOf(16.359860,48.213950,105.500000),
+ arrayOf(16.360029,48.213931,99.400000),
+ arrayOf(16.360197,48.213913,99.400000),
+ arrayOf(16.360366,48.213894,99.400000),
+ arrayOf(16.360534,48.213876,99.400000),
+ arrayOf(16.360703,48.213857,99.400000),
+ arrayOf(16.360871,48.213839,99.400000),
+ arrayOf(16.361040,48.213820,99.400000),
+ arrayOf(16.361270,48.213750,114.500000),
+ arrayOf(16.361440,48.213640,134.200000),
+ arrayOf(16.361605,48.213725,52.300000),
+ arrayOf(16.361770,48.213810,52.300000),
+ arrayOf(16.361912,48.213873,56.600000),
+ arrayOf(16.362055,48.213935,56.600000),
+ arrayOf(16.362198,48.213998,56.600000),
+ arrayOf(16.362340,48.214060,56.600000),
+ arrayOf(16.362590,48.214170,56.600000),
+ arrayOf(16.362620,48.214130,153.400000),
+ arrayOf(16.362750,48.214010,144.200000),
+ arrayOf(16.362880,48.213890,144.200000),
+ arrayOf(16.362660,48.213790,235.700000),
+ arrayOf(16.362590,48.213870,329.800000),
+ arrayOf(16.362530,48.213940,330.300000),
+ arrayOf(16.362670,48.214010,53.100000),
+ arrayOf(16.362804,48.214073,55.000000),
+ arrayOf(16.362938,48.214135,55.000000),
+ arrayOf(16.363071,48.214197,55.000000),
+ arrayOf(16.363205,48.214260,55.000000),
+ arrayOf(16.363339,48.214323,55.000000),
+ arrayOf(16.363473,48.214385,55.000000),
+ arrayOf(16.363606,48.214447,55.000000),
+ arrayOf(16.363740,48.214510,55.000000),
+ arrayOf(16.363871,48.214569,55.800000),
+ arrayOf(16.364002,48.214628,55.800000),
+ arrayOf(16.364133,48.214687,55.800000),
+ arrayOf(16.364263,48.214747,55.800000),
+ arrayOf(16.364394,48.214806,55.800000),
+ arrayOf(16.364525,48.214865,55.800000),
+ arrayOf(16.364656,48.214924,55.800000),
+ arrayOf(16.364787,48.214983,55.800000),
+ arrayOf(16.364918,48.215043,55.800000),
+ arrayOf(16.365048,48.215102,55.800000),
+ arrayOf(16.365179,48.215161,55.800000),
+ arrayOf(16.365310,48.215220,55.800000),
+ arrayOf(16.365446,48.215284,54.600000),
+ arrayOf(16.365581,48.215349,54.600000),
+ arrayOf(16.365717,48.215413,54.600000),
+ arrayOf(16.365853,48.215477,54.600000),
+ arrayOf(16.365989,48.215541,54.600000),
+ arrayOf(16.366124,48.215606,54.600000),
+ arrayOf(16.366260,48.215670,54.600000),
+ arrayOf(16.366391,48.215729,55.900000),
+ arrayOf(16.366522,48.215788,55.900000),
+ arrayOf(16.366653,48.215847,55.900000),
+ arrayOf(16.366784,48.215906,55.900000),
+ arrayOf(16.366915,48.215965,55.900000),
+ arrayOf(16.367046,48.216024,55.900000),
+ arrayOf(16.367177,48.216083,55.900000),
+ arrayOf(16.367308,48.216142,55.900000),
+ arrayOf(16.367439,48.216201,55.900000),
+ arrayOf(16.367570,48.216260,55.900000),
+ arrayOf(16.367698,48.216319,55.200000),
+ arrayOf(16.367827,48.216379,55.200000),
+ arrayOf(16.367956,48.216438,55.200000),
+ arrayOf(16.368084,48.216498,55.200000),
+ arrayOf(16.368212,48.216558,55.200000),
+ arrayOf(16.368341,48.216617,55.200000),
+ arrayOf(16.368469,48.216676,55.200000),
+ arrayOf(16.368598,48.216736,55.200000),
+ arrayOf(16.368727,48.216795,55.200000),
+ arrayOf(16.368855,48.216855,55.200000),
+ arrayOf(16.368983,48.216915,55.200000),
+ arrayOf(16.369112,48.216974,55.200000),
+ arrayOf(16.369241,48.217033,55.200000),
+ arrayOf(16.369369,48.217093,55.200000),
+ arrayOf(16.369498,48.217152,55.200000),
+ arrayOf(16.369626,48.217212,55.200000),
+ arrayOf(16.369754,48.217272,55.200000),
+ arrayOf(16.369883,48.217331,55.200000),
+ arrayOf(16.370012,48.217391,55.200000),
+ arrayOf(16.370140,48.217450,55.200000),
+ arrayOf(16.370310,48.217510,62.100000),
+ arrayOf(16.370540,48.217540,78.900000),
+ arrayOf(16.370705,48.217530,95.200000),
+ arrayOf(16.370870,48.217520,95.200000),
+ arrayOf(16.371100,48.217500,97.400000),
+ arrayOf(16.371250,48.217410,132.000000),
+ arrayOf(16.371400,48.217320,132.000000),
+ arrayOf(16.371580,48.217200,135.000000),
+ arrayOf(16.371675,48.217118,142.500000),
+ arrayOf(16.371770,48.217035,142.500000),
+ arrayOf(16.371865,48.216952,142.500000),
+ arrayOf(16.371960,48.216870,142.500000),
+ arrayOf(16.372055,48.216788,142.500000),
+ arrayOf(16.372150,48.216705,142.500000),
+ arrayOf(16.372245,48.216622,142.500000),
+ arrayOf(16.372340,48.216540,142.500000),
+ arrayOf(16.372417,48.216450,150.400000),
+ arrayOf(16.372493,48.216360,150.400000),
+ arrayOf(16.372570,48.216270,150.400000),
+ arrayOf(16.372647,48.216180,150.400000),
+ arrayOf(16.372723,48.216090,150.400000),
+ arrayOf(16.372800,48.216000,150.400000),
+ arrayOf(16.372877,48.215910,150.400000),
+ arrayOf(16.372953,48.215820,150.400000),
+ arrayOf(16.373030,48.215730,150.400000),
+ arrayOf(16.373100,48.215632,154.500000),
+ arrayOf(16.373170,48.215534,154.500000),
+ arrayOf(16.373240,48.215436,154.500000),
+ arrayOf(16.373310,48.215338,154.500000),
+ arrayOf(16.373380,48.215240,154.500000),
+ arrayOf(16.373455,48.215100,160.400000),
+ arrayOf(16.373530,48.214960,160.400000),
+ arrayOf(16.373592,48.214860,157.700000),
+ arrayOf(16.373653,48.214760,157.700000),
+ arrayOf(16.373715,48.214660,157.700000),
+ arrayOf(16.373777,48.214560,157.700000),
+ arrayOf(16.373838,48.214460,157.700000),
+ arrayOf(16.373900,48.214360,157.700000),
+ arrayOf(16.373970,48.214270,152.600000),
+ arrayOf(16.374040,48.214180,152.600000),
+ arrayOf(16.374110,48.214090,152.600000),
+ arrayOf(16.374185,48.213997,151.600000),
+ arrayOf(16.374260,48.213905,151.600000),
+ arrayOf(16.374335,48.213813,151.600000),
+ arrayOf(16.374410,48.213720,151.600000),
+ arrayOf(16.374507,48.213630,144.200000),
+ arrayOf(16.374605,48.213540,144.200000),
+ arrayOf(16.374703,48.213450,144.200000),
+ arrayOf(16.374800,48.213360,144.200000),
+ arrayOf(16.374909,48.213286,135.400000),
+ arrayOf(16.375018,48.213213,135.400000),
+ arrayOf(16.375127,48.213139,135.400000),
+ arrayOf(16.375236,48.213065,135.400000),
+ arrayOf(16.375345,48.212992,135.400000),
+ arrayOf(16.375455,48.212918,135.400000),
+ arrayOf(16.375564,48.212845,135.400000),
+ arrayOf(16.375673,48.212771,135.400000),
+ arrayOf(16.375782,48.212697,135.400000),
+ arrayOf(16.375891,48.212624,135.400000),
+ arrayOf(16.376000,48.212550,135.400000),
+ arrayOf(16.376133,48.212480,128.400000),
+ arrayOf(16.376265,48.212410,128.400000),
+ arrayOf(16.376397,48.212340,128.400000),
+ arrayOf(16.376530,48.212270,128.400000),
+ arrayOf(16.376690,48.212210,119.400000),
+ arrayOf(16.376850,48.212150,119.400000),
+ arrayOf(16.377003,48.212106,113.500000),
+ arrayOf(16.377156,48.212061,113.500000),
+ arrayOf(16.377309,48.212017,113.500000),
+ arrayOf(16.377461,48.211973,113.500000),
+ arrayOf(16.377614,48.211929,113.500000),
+ arrayOf(16.377767,48.211884,113.500000),
+ arrayOf(16.377920,48.211840,113.500000),
+ arrayOf(16.378082,48.211796,112.200000),
+ arrayOf(16.378244,48.211752,112.200000),
+ arrayOf(16.378406,48.211708,112.200000),
+ arrayOf(16.378568,48.211664,112.200000),
+ arrayOf(16.378730,48.211620,112.200000),
+ arrayOf(16.378910,48.211580,108.400000),
+ arrayOf(16.379090,48.211540,108.400000),
+ arrayOf(16.379240,48.211520,101.300000),
+ arrayOf(16.379390,48.211500,101.300000),
+ arrayOf(16.379542,48.211490,95.600000),
+ arrayOf(16.379695,48.211480,95.600000),
+ arrayOf(16.379848,48.211470,95.600000),
+ arrayOf(16.380000,48.211460,95.600000),
+ arrayOf(16.380153,48.211453,94.000000),
+ arrayOf(16.380306,48.211446,94.000000),
+ arrayOf(16.380459,48.211439,94.000000),
+ arrayOf(16.380611,48.211431,94.000000),
+ arrayOf(16.380764,48.211424,94.000000),
+ arrayOf(16.380917,48.211417,94.000000),
+ arrayOf(16.381070,48.211410,94.000000),
+ arrayOf(16.381233,48.211406,92.300000),
+ arrayOf(16.381397,48.211401,92.300000),
+ arrayOf(16.381560,48.211397,92.300000),
+ arrayOf(16.381723,48.211392,92.300000),
+ arrayOf(16.381887,48.211388,92.300000),
+ arrayOf(16.382050,48.211383,92.300000),
+ arrayOf(16.382213,48.211379,92.300000),
+ arrayOf(16.382377,48.211374,92.300000),
+ arrayOf(16.382540,48.211370,92.300000)
+ )
+
+}
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerCircleTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerCircleTestCase.kt
new file mode 100644
index 0000000000..e0f0dbe44b
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerCircleTestCase.kt
@@ -0,0 +1,15 @@
+package com.mousebirdconsulting.autotester.TestCases
+
+import android.app.Activity
+
+class MapTilerCircleTestCase(activity: Activity) :
+ MapTilerTestCase(activity, "MapTiler Circles")
+{
+ override fun getMaps() = listOf("maptiler_test_circles.json")
+
+ //override fun getStyleJson(whichMap: Int) =
+ //override fun setup(map: MapboxKindaMap) {
+ // super.setup(map)
+ // map.styleSettings.markerImportance = 200000.0 //Float.MAX_VALUE.toDouble()
+ //}
+}
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerTestCase.kt
index a29d8f5d7c..077a8f6962 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerTestCase.kt
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MapTilerTestCase.kt
@@ -2,79 +2,137 @@ package com.mousebirdconsulting.autotester.TestCases
import android.app.Activity
import android.net.Uri
+import android.util.Log
import com.mousebird.maply.*
-import com.mousebirdconsulting.autotester.ConfigOptions
import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
import okio.Okio
import java.io.IOException
+import kotlin.math.min
-class MapTilerTestCase : MaplyTestCase {
- constructor(activity: Activity) : super(activity) {
- setTestName("MapTiler")
- implementation = TestExecutionImplementation.Both
+open class MapTilerTestCase : MaplyTestCase
+{
+ constructor(activity: Activity) :
+ this(activity, "MapTiler", TestExecutionImplementation.Both) {
}
-
- var map: MapboxKindaMap? = null
-
+
+ protected constructor(activity: Activity, name: String, impl: TestExecutionImplementation = TestExecutionImplementation.Both) :
+ super(activity, name, impl) {
+ }
+
+ // Maptiler token
+ // Go to maptiler.com, setup an account and get your own
+ private val token = "GetYerOwnToken"
+
// Set up the loader (and all the stuff it needs) for the map tiles
private fun setupLoader(control: BaseController, whichMap: Int) {
- // Third map is no map
- if (whichMap > 1)
- return;
-
- val mapName = if (whichMap == 0) "maptiler_basic.json" else "maptiler_streets.json"
-
- val assetMgr = getActivity().assets
- val stream = assetMgr.open(mapName)
- var polyStyle: MapboxVectorStyleSet?
-
- // Maptiler token
- // Go to maptiler.com, setup an account and get your own
- val token = "GetYerOwnToken"
-
- try {
- val json = Okio.buffer(Okio.source(stream)).readUtf8()
- map = object: MapboxKindaMap(json,control) {
- override fun mapboxURLFor(file: Uri): Uri {
- val str = file.toString()
- return Uri.parse(str.replace("MapTilerKey",token))
- }
+ // Approximate the effect of `UIScreen.scale` on iOS
+ val dpi = displayDensity ?: Point2d(200.0,200.0)
+ val scale = min(dpi.x,dpi.y) / 225
+
+ getStyleJson(whichMap)?.let { json ->
+ val settings = VectorStyleSettings(scale).apply {
+ baseDrawPriority = QuadImageLoaderBase.BaseDrawPriorityDefault + 1000
+ drawPriorityPerLevel = 100
+ }
+ map = MapboxKindaMap(json, control, settings).apply {
+ mapboxURLFor = { Uri.parse(it.toString().replace("MapTilerKey", token)) }
+ backgroundAllPolys = (control is GlobeController)
+ imageVectorHybrid = true
+ minImportance = 768.0 * 768.0
+ setup(this)
+ start()
}
- if (map == null)
- return
- map?.backgroundAllPolys = true
- map?.start()
}
- catch (e: IOException) {
- return
+
+ // Set up an overlay with the same importance showing the
+ // tile boundaries, for debugging/troubleshooting purposes
+ map?.let {
+ // Describes how to break down the space
+ val params = SamplingParams().apply {
+ minZoom = 1
+ maxZoom = 20
+ singleLevel = true
+ minImportance = it.minImportance
+ coordSystem = SphericalMercatorCoordSystem()
+ }
+ loader = QuadPagingLoader(params, OvlDebugImageLoaderInterpreter(), control)
}
}
+ protected open fun setup(map: MapboxKindaMap) {
+ map.styleSettings.drawPriorityPerLevel = 100
+ }
+
+ protected open fun getStyleJson(whichMap: Int): String? =
+ getMaps().elementAt(whichMap)?.let {
+ Log.i(javaClass.name, "Loading $it")
+ try {
+ Okio.buffer(Okio.source(getActivity().assets.open(it))).readUtf8()
+ } catch (e: IOException) {
+ Log.w(javaClass.simpleName, "Failed to load style $it", e)
+ return null
+ }
+ } ?: customStyle
+
// Switch maps on long press
+ override fun userDidLongPress(globeControl: GlobeController?, selObjs: Array?, loc: Point2d?, screenLoc: Point2d?) {
+ switchMaps()
+ }
override fun userDidLongPress(mapController: MapController?, selObjs: Array?, loc: Point2d?, screenLoc: Point2d?) {
- map?.stop()
-
- currentMap = currentMap + 1
- if (currentMap > 2)
- currentMap = 0
- setupLoader(baseViewC!!, currentMap)
+ switchMaps()
}
- var currentMap = 0
- var baseViewC : BaseController? = null
-
+ private fun switchMaps() {
+ loader = null
+ map?.stop()
+ map = null
+ currentMap = (currentMap + 1) % getMaps().size
+ baseViewC?.let { setupLoader(it, currentMap) }
+ }
+
override fun setUpWithGlobe(globeVC: GlobeController?): Boolean {
- baseViewC = globeVC
- setupLoader(baseViewC!!, currentMap)
-
+ baseViewC = globeVC?.also {
+ setupLoader(it, currentMap)
+ it.animatePositionGeo(Point2d.FromDegrees(-100.0, 40.0), 0.5, 0.0, 0.5)
+ }
return true
}
override fun setUpWithMap(mapVC: MapController?): Boolean {
- baseViewC = mapVC
- setupLoader(baseViewC!!, currentMap)
-
+ baseViewC = mapVC?.also {
+ setupLoader(it, currentMap)
+ it.animatePositionGeo(Point2d.FromDegrees(-100.0, 40.0), 0.5, 0.0, 0.5)
+ }
return true
}
-
+
+ protected open fun getMaps(): Collection = listOf(
+ "maptiler_basic.json",
+ "maptiler_streets.json",
+ "maptiler_topo.json",
+ "maptiler_hybrid_satellite.json",
+ "maptiler_expr_test.json",
+ null // placeholder for custom stylesheet below
+ )
+
+ private var currentMap = 0
+ private var map: MapboxKindaMap? = null
+ private var baseViewC : BaseController? = null
+ private var loader : QuadPagingLoader? = null
+
+ // Use this to test out a single or small number of elements alone.
+ // This can be helpful when you want to set a breakpoint on something that's normally used by many styles.
+ private val customStyle = """
+ { "name":"test","version":8,"layers":[
+ { "id":"background","type":"background","paint":{"background-color":"#aaa"}
+ },{"id":"road_motorway","type":"line","source":"openmaptiles",
+ "source-layer":"transportation","filter":["all",["==","class","motorway"]],
+ "paint":{
+ "line-color":{"base":1,"stops":[[5,"hsl(26,87%,62%)"],[16,"#0f0"]]},
+ "line-width":{"base":1.2,"stops":[[5,0],[16,60]]}
+ }
+ }
+ ],"sources":{"openmaptiles":{"type":"vector",
+ "url":"https://api.maptiler.com/tiles/v3/tiles.json?key=MapTilerKey"}}}
+ """.trimIndent()
}
\ No newline at end of file
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MovingScreenMarkersTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MovingScreenMarkersTestCase.kt
new file mode 100644
index 0000000000..69d6d9cce4
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/MovingScreenMarkersTestCase.kt
@@ -0,0 +1,123 @@
+/*
+ * MovingScreenMarkersTestCase.kt
+ * WhirlyGlobeLib
+ *
+ * Created by Tim Sylvester on 9 Feb 2021.
+ * Copyright 2021 mousebird consulting
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.mousebirdconsulting.autotester.TestCases
+
+import android.app.Activity
+import android.graphics.BitmapFactory
+import android.os.Handler
+import com.mousebird.maply.*
+import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
+import com.mousebirdconsulting.autotester.R
+
+public class MovingScreenMarkersTestCase : MaplyTestCase {
+
+ constructor(activity: Activity) : super(activity) {
+ testName = "Moving Screen Markers"
+ implementation = TestExecutionImplementation.Both
+
+ baseCase = VectorsTestCase(activity)
+ }
+
+ override fun setUpWithGlobe(globeVC: GlobeController?): Boolean {
+ if (!baseCase.setUpWithGlobe(globeVC)) {
+ return false
+ }
+ setUp()
+ globeVC?.animatePositionGeo(0.1, 0.1, 0.5, 0.0, 0.5)
+ return true
+ }
+
+ override fun setUpWithMap(mapVC: MapController?): Boolean {
+ if (!baseCase.setUpWithMap(mapVC)) {
+ return false
+ }
+ setUp()
+ mapVC?.animatePositionGeo(0.0, 0.1, 0.5, 0.0, 0.5)
+ return true
+ }
+
+ private fun setUp() {
+ val icon0 = BitmapFactory.decodeResource(getActivity().resources, R.drawable.teardrop)
+ val icon1 = BitmapFactory.decodeResource(getActivity().resources, R.drawable.teardrop_stroked)
+ textures = arrayOf(
+ controller.addTexture(icon0, null, threadCurrent)!!,
+ controller.addTexture(icon1, null, threadCurrent)!!)
+
+ timerRunnable = Runnable {
+ clearMarkers()
+ markerObj = makeMarkers()
+ if (timerRunnable != null) {
+ timerHandler.postDelayed(timerRunnable, (1000 * duration).toLong())
+ }
+ }
+ timerHandler.postDelayed(timerRunnable, 0)
+ }
+
+ override fun shutdown() {
+ timerRunnable.also {
+ timerRunnable = null
+ timerHandler.removeCallbacks(it)
+ }
+
+ baseCase.shutdown()
+ super.shutdown()
+ }
+
+ private fun clearMarkers() {
+ markerObj?.also {
+ controller.removeObject(it, threadCurrent)
+ markerObj = null
+ }
+ }
+
+ private fun makeMarkers(): ComponentObject? {
+ val pts = arrayOf(
+ Point2d.FromDegrees(0.0, 0.0),
+ Point2d.FromDegrees(10.0, 10.0),
+ Point2d.FromDegrees(0.0, 20.0),
+ Point2d.FromDegrees(-10.0, 10.0)
+ )
+
+ val markers = pts.indices.map {
+ ScreenMovingMarker().apply {
+ duration = duration
+ period = duration / 2
+ loc = pts[it]
+ endLoc = pts[(it + 1) % pts.size]
+ size = Point2d(32.0, 32.0)
+ images = textures
+ layoutImportance = Float.MAX_VALUE
+ }
+ }
+ return controller.addScreenMovingMarkers(markers, MarkerInfo(), threadCurrent)
+ }
+
+ private val threadCurrent = RenderControllerInterface.ThreadMode.ThreadCurrent
+
+ private var baseCase: VectorsTestCase
+ private val duration = 5.0
+
+ private var timerRunnable: Runnable? = null
+ private val timerHandler = Handler()
+
+ private var textures: Array? = null
+ private var markerObj: ComponentObject? = null
+}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/OpenMapTilesHybridTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/OpenMapTilesHybridTestCase.kt
index 0a784b2cf9..018e6b1e7d 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/OpenMapTilesHybridTestCase.kt
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/OpenMapTilesHybridTestCase.kt
@@ -69,7 +69,7 @@ class OpenMapTilesHybridTestCase : MaplyTestCase {
polyStyleGen = VectorStyleSimpleGenerator(control)
lineStyleGen = VectorStyleSimpleGenerator(control)
- // The interpeter renders some of the data into images and overlays the rest
+ // The interpreter renders some of the data into images and overlays the rest
interp = MapboxVectorInterpreter(polyStyleGen, tileRenderer, lineStyleGen, control)
// Finally the loader asks for tiles
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/PagingLayerTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/PagingLayerTestCase.kt
index 33c0821fee..083bd31571 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/PagingLayerTestCase.kt
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/PagingLayerTestCase.kt
@@ -36,7 +36,7 @@ class PagingLayerTestCase(activity: Activity) : MaplyTestCase(activity) {
fun setupLayer(vc: BaseController) {
// Describes how to break down the space
val params = SamplingParams()
- params.minZoom = 4
+ params.minZoom = 0
params.maxZoom = 22
params.minImportance = 256.0*256.0
params.singleLevel = true
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SLDTestCase.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SLDTestCase.java
index 5e92470195..44c1266016 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SLDTestCase.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SLDTestCase.java
@@ -93,11 +93,11 @@ public void run() {
"belfast_ireland_roads.geojson",
"belfast_ireland_amenities.geojson"};
- AssetWrapper assetWrap = new AssetWrapper(activity.getAssets());
+ AssetWrapper assetWrap = new AssetWrapper(getActivity().getAssets());
for (int i=0; i objects, BaseController baseVC
labelInfo.setBackgroundColor(Color.BLUE);
labelInfo.setTypeface(Typeface.DEFAULT);
labelInfo.setLayoutImportance(1.f);
+// labelInfo.setLayoutImportance(Float.MAX_VALUE);
labelInfo.setLayoutPlacement(LabelInfo.LayoutRight | LabelInfo.LayoutCenter);
labelInfo.setTextJustify(LabelInfo.TextJustify.TextLeft);
// labelInfo.setMinVis(0.f);
@@ -97,7 +98,10 @@ private void insertLabels(ArrayList objects, BaseController baseVC
label.text = labelName;
label.loc = object.centroid();
label.selectable = true;
- label.layoutImportance = 1.f;
+// label.layoutImportance = 1.f;
+// label.layoutImportance = Float.MAX_VALUE;
+// label.layoutSize = new Point2d(1000.0f, 256.f );
+// label.offset = new Point2d(0.0,-300);
// label.rotation = Math.PI/4.0;
labels.add(label);
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ScreenMarkersTestCase.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ScreenMarkersTestCase.java
index ffebfe1d10..2c2d0f8ed3 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ScreenMarkersTestCase.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ScreenMarkersTestCase.java
@@ -78,7 +78,8 @@ private void insertMarkers(ArrayList vectors, BaseController baseV
marker.size = new Point2d(128, 128);
marker.rotation = Math.random() * 2.f * Math.PI;
marker.selectable = true;
-// marker.offset = new Point2d(-64,-64);
+// marker.offset = new Point2d(0.0,-200);
+// marker.layoutSize = new Point2d(0.0, 64.0);
AttrDictionary attrs = vector.getAttributes();
if (attrs != null) {
marker.userObject = attrs.getString("ADMIN");
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ShapefileTestCase.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ShapefileTestCase.java
index 18dd565c18..3d749739f1 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ShapefileTestCase.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/ShapefileTestCase.java
@@ -3,12 +3,13 @@
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
-import android.graphics.Color;
import android.util.Log;
import com.mousebird.maply.GlobeController;
import com.mousebird.maply.MapController;
import com.mousebird.maply.BaseController;
+import com.mousebird.maply.Mbr;
+import com.mousebird.maply.Point2d;
import com.mousebird.maply.RenderController;
import com.mousebird.maply.VectorInfo;
import com.mousebird.maply.VectorObject;
@@ -59,7 +60,7 @@ private File copyFile(String srcName, String destName) throws IOException {
return of;
}
- public void addShapeFile(BaseController baseVC) {
+ public Mbr addShapeFile(BaseController baseVC) {
try {
File dbfFile = copyFile("sf_roads/tl_2013_06075_roads.dbf", "sf_roads.dbf");
File shpFile = copyFile("sf_roads/tl_2013_06075_roads.shp", "sf_roads.shp");
@@ -67,15 +68,21 @@ public void addShapeFile(BaseController baseVC) {
if (dbfFile != null && shpFile != null && shxFile != null) {
VectorObject vecObj = new VectorObject();
vecObj.fromShapeFile(shpFile.getAbsolutePath());
- int numPoints = vecObj.countPoints();
+ //int numPoints = vecObj.countPoints();
VectorInfo vecInfo = new VectorInfo();
- vecInfo.setColor(Color.RED);
+ //vecInfo.setColor(Color.RED);
baseVC.addVector(vecObj,vecInfo, RenderController.ThreadMode.ThreadAny);
+
+ Point2d ll = new Point2d();
+ Point2d ur = new Point2d();
+ vecObj.boundingBox(ll, ur);
+ return new Mbr(ll, ur);
}
}
catch (Exception e) {
Log.d("Maply", e.toString());
}
+ return null;
}
@Override
@@ -83,7 +90,12 @@ public boolean setUpWithGlobe(GlobeController globeVC) throws Exception {
StamenRemoteTestCase baseView = new StamenRemoteTestCase(getActivity());
baseView.setUpWithGlobe(globeVC);
- addShapeFile(globeVC);
+ Mbr bbox = addShapeFile(globeVC);
+ if (bbox != null) {
+ Point2d center = bbox.middle();
+ double height = globeVC.findHeightToViewBounds(bbox, center);
+ globeVC.animatePositionGeo(center.getX(),center.getY(),height,2.0);
+ }
return true;
}
@@ -93,7 +105,12 @@ public boolean setUpWithMap(MapController mapVC) throws Exception {
StamenRemoteTestCase baseView = new StamenRemoteTestCase(getActivity());
baseView.setUpWithMap(mapVC);
- addShapeFile(mapVC);
+ Mbr bbox = addShapeFile(mapVC);
+ if (bbox != null) {
+ Point2d center = bbox.middle();
+ double height = mapVC.findHeightToViewBounds(bbox, center);
+ mapVC.animatePositionGeo(center.getX(),center.getY(),height,2.0);
+ }
return true;
}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SimpleStyleTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SimpleStyleTestCase.kt
new file mode 100644
index 0000000000..1676a20959
--- /dev/null
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/SimpleStyleTestCase.kt
@@ -0,0 +1,243 @@
+/* SimpleStyleTestCase.kt
+ * AutoTesterAndroid.app
+ *
+ * Created by Tim Sylvester on 12/02/2021
+ * Copyright © 2021 mousebird consulting, inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed
+ * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ * CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+
+package com.mousebirdconsulting.autotester.TestCases
+
+import android.app.Activity
+import android.util.Log
+import com.mousebird.maply.*
+import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
+
+class SimpleStyleTestCase(activity: Activity) : MaplyTestCase(activity, "Simple Vector Styles") {
+
+ override fun setUpWithGlobe(globeVC: GlobeController): Boolean {
+ baseCase.setUpWithGlobe(globeVC)
+ runExamples(globeVC)
+ globeVC.animatePositionGeo(Point2d.FromDegrees(145.0, -33.0), 0.2, 0.0, 0.5)
+ return true
+ }
+
+ override fun setUpWithMap(mapVC: MapController): Boolean {
+ baseCase.setUpWithMap(mapVC)
+ runExamples(mapVC)
+ mapVC.animatePositionGeo(Point2d.FromDegrees(145.0, -33.0), 0.2, 0.0, 0.5)
+ return true
+ }
+
+ override fun shutdown() {
+ cleanup()
+ super.shutdown()
+ }
+
+ private fun cleanup() {
+ componentObjects?.let {
+ controller?.removeObjects(it, threadCurrent)
+ componentObjects = null
+ }
+ styleManager?.shutdown()
+ styleManager = null
+ }
+
+ private fun runExamples(vc: BaseController) {
+ cleanup()
+ styleManager = SimpleStyleManager(activity.applicationContext, vc).apply {
+ medSize = Point2d(42.0, 36.0)
+ largeSize = Point2d(64.0, 80.0)
+ objectLocator = object : SimpleStyleManager.StyleObjectLocator {
+ override fun locate(name: String): Collection {
+ return listOf("$name.png", "maki icons/$name-24@2x.png")
+ }
+ }
+ onAddMarker = { obj, marker, info, style ->
+ marker.userObject = obj
+ if (style.labelOffset != null) {
+ info.setLayoutImportance(Float.MAX_VALUE)
+ }
+ true
+ }
+ }.also { styleMan ->
+ componentObjects = arrayOf(vectorGeoJson1, vectorGeoJson2).flatMap { json ->
+ VectorObject().let { obj ->
+ if (obj.fromGeoJSON(json)) {
+ styleMan.addFeatures(obj, threadAny)
+ } else {
+ Log.e(javaClass.name, "Failed to parse JSON")
+ sequenceOf()
+ }
+ }.toList()
+ }
+ }
+ }
+
+ private fun prop(name: String, value: String?, quote: Boolean): String? {
+ return if (value == null) null else ("\"$name\": " + (if (quote) "\"$value\"" else value))
+ }
+
+ private fun marker(title: String, lat: Double, lon: Double, m: String? = null, bg: String? = null,
+ c: Boolean? = null, mC: String? = null, mA: Double? = null, fC: String? = null,
+ fA: Double? = null, s: Double? = null, sC: String? = null, sA: Double? = null,
+ mSz: String? = null, ox: Double? = null, oy: Double? = null, lC: String? = null,
+ lSz: Double? = null, lx: Double? = null, ly: Double? = null): String {
+ return """
+ {
+ "type": "Feature",
+ "properties": {
+ """ +
+ arrayOf(prop("title", title, true),
+ prop("marker-size", mSz ?: "large", true),
+ prop("marker-color", mC, true),
+ prop("marker-opacity", "$mA", false),
+ prop("marker-symbol", m, true),
+ prop("marker-background-symbol", bg, true),
+ prop("marker-circle", "${!(c ?: true)}", false),
+ prop("marker-offset-x", if (ox != null) "$ox" else null, false),
+ prop("marker-offset-y", if (oy != null) "$oy" else null, false),
+ prop("fill", fC, true),
+ prop("fill-opacity", if (fA != null) "$fA" else null, false),
+ prop("stroke-width", if (s != null) "$s" else null, false),
+ prop("stroke", sC, true),
+ prop("stroke-opacity", if (sA != null) "$sA" else null, false),
+ prop("label", lC, true),
+ prop("label-size", if (lSz != null) "$lSz" else null, false),
+ prop("label-offset-x", if (lx != null) "$lx" else null, false),
+ prop("label-offset-y", if (ly != null) "$ly" else null, false)
+ ).filterNotNull().joinToString(",") +
+ """
+ },
+ "geometry": { "type": "Point", "coordinates": [ $lon, $lat ] }
+ }
+ """
+ }
+
+ private fun markers1(): String {
+ val startLon = 142.0
+ var lat = -30.0
+ var lon = startLon
+ val latStep = 0.05
+ val lonStep = 0.05
+ var n = 0
+ val rowSize = 64
+ return arrayOf(null, "bar").flatMap { m ->
+ arrayOf(null, "marker-stroked").flatMap { bg ->
+ arrayOf("small", "medium", "large").flatMap { mSz ->
+ arrayOf(0.0, 2.0, 5.0).flatMap { sWidth ->
+ arrayOf(0.0, 0.5, 1.0).flatMap { fillA ->
+ arrayOf(true, false).flatMap { circle ->
+ arrayOf("f0f", "#0f0").flatMap { mColor ->
+ arrayOf("0fa", "#a0f").flatMap { fColor ->
+ arrayOf("fa0", "#0af").map { sColor ->
+ lon += lonStep
+ if ((n++ % rowSize) == 0) { lat -= latStep; lon = startLon }
+ marker("", lat, lon, m, bg, circle, mColor, null, fColor,
+ fillA, sWidth, sColor, 0.8, mSz)
+ } } } } } } } }
+ }.joinToString(",")
+ }
+
+ private fun fmt(v: Double): String {
+ return Regex("\\.0+$").replace("$v", "")
+ }
+ private fun markers2(): String {
+ return arrayOf(-4.0, -1.5, 0.0, 1.0).flatMap { ox ->
+ arrayOf(-5.0, -1.5, 0.0, 1.0).map { oy ->
+ marker("${fmt(ox)},${fmt(oy)}", -30.0, 140.0,null, "marker-stroked",
+ false, "f0f", null, "0fa", 0.7, 0.2, "#0af", 0.8,
+ "medium", ox, oy, "#f50", 5.0, ox * 45 / 5, oy * 38 / 5)
+ }
+ }.joinToString(",")
+ }
+
+ private fun markers3(): String {
+ return arrayOf(
+ marker("",-33.0,140.0,"square","wide",false,"#f00",0.7,"#00f",null,
+ null,null,null,"large",null,null,null,null,null,null),
+ marker("",-33.1,140.0,"square","tall",false,"#00f",0.7,"#00f",null,
+ null,null,null,"large",null,null,null,null,null,null),
+ marker("",-33.0,140.1,"wide","square",false,"#0f0",0.7,"#00f",null,
+ null,null,null,"large",null,null,null,null,null,null),
+ marker("",-33.1,140.1,"tall","square",false,"#f0f",0.7,"#00f",null,
+ null,null,null,"large",null,null,null,null,null,null)
+ ).joinToString(",")
+ }
+
+ private val vectorGeoJson1 = """
+ { "type": "FeatureCollection",
+ "features": [{
+ "type": "Feature",
+ "properties": {
+ "title": "line",
+ "stroke": "#0000ff",
+ "stroke-width": 10.0
+ }, "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [ 140.0677490234375, -31.97871614600332 ],
+ [ 130.55389404296875, -31.764181375100804 ]
+ ] } } ]
+ }"""
+
+ private val vectorGeoJson2 = """
+ { "type": "FeatureCollection",
+ "features": [
+ ${markers1()},
+ ${markers2()},
+ ${markers3()},
+ { "type": "Feature",
+ "properties": {
+ "title": "poly",
+ "fill": "#ff0000",
+ "stroke": "#ffffff"
+ }, "geometry": {
+ "type": "Polygon",
+ "coordinates": [ [
+ [ 150.40283203125, -33.504759069226075 ],
+ [ 151.10595703125, -33.504759069226075 ],
+ [ 151.10595703125, -33.16974360021616 ],
+ [ 150.40283203125, -33.16974360021616 ],
+ [ 150.40283203125, -33.504759069226075 ]
+ ] ] } }, {
+ "type": "Feature",
+ "properties": {
+ "title": "line",
+ "stroke": "#0000ff",
+ "stroke-width": 10.0
+ }, "geometry": {
+ "type": "LineString",
+ "coordinates": [
+ [ 150.0677490234375, -32.97871614600332 ],
+ [ 150.14190673828125, -32.97641208290518 ],
+ [ 150.5731201171875, -32.95797741405951 ],
+ [ 150.98236083984375, -33.01096671579776 ],
+ [ 150.75164794921875, -33.08463802391686 ],
+ [ 149.91943359375, -33.27084277265288 ],
+ [ 149.77935791015625, -32.9049563191375 ],
+ [ 150.24078369140625, -32.669436832605314 ],
+ [ 150.55389404296875, -32.764181375100804 ]
+ ] } } ]
+ }"""
+
+ private val baseCase: MaplyTestCase
+
+ private var styleManager: SimpleStyleManager? = null
+ private var componentObjects: List? = null
+
+ private val threadAny = ThreadMode.ThreadAny
+ private val threadCurrent = ThreadMode.ThreadCurrent
+
+ init {
+ baseCase = StamenRemoteTestCase(activity)
+ }
+}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/TextureVectorTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/TextureVectorTestCase.kt
index 5fa93cf79a..6bcd414605 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/TextureVectorTestCase.kt
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/TextureVectorTestCase.kt
@@ -22,6 +22,7 @@ package com.mousebirdconsulting.autotester.TestCases
import android.app.Activity
import android.graphics.BitmapFactory
import android.graphics.Color
+import android.util.Log
import com.mousebird.maply.*
import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
import com.mousebirdconsulting.autotester.R
@@ -32,104 +33,97 @@ import java.util.*
import kotlin.math.PI
import kotlin.math.abs
-class TextureVectorTestCase : MaplyTestCase {
-
- constructor(activity: Activity) : super(activity) {
- setTestName("Textured Vectors")
- implementation = TestExecutionImplementation.Both
- }
-
+class TextureVectorTestCase(activity: Activity) : MaplyTestCase(activity, "Textured Vectors") {
+
// Grid size to use for clipping
// Smaller is going to be more triangles, but look better
// Might be better to use a bigger size for the poles
- val ClipGridSize = 2.0/180.0* PI
+ private val ClipGridSize = 2.0/180.0* PI
- fun buildCountries(control: BaseController) : ComponentObject {
- val icon = BitmapFactory.decodeResource(getActivity().resources, R.drawable.testtarget)
- val tex = control.addTexture(icon, null, RenderControllerInterface.ThreadMode.ThreadCurrent)
+ private fun buildCountries(control: BaseController) : ComponentObject {
+ val assetMgr = activity.assets
+ val isGlobe = control is GlobeController
+
+ val icon = BitmapFactory.decodeResource(activity.resources, R.drawable.testtarget)
+ val tex = control.addTexture(icon, null, ThreadMode.ThreadCurrent)
+ val paths = assetMgr.list("country_json_50m")?.sortedDescending() ?: emptyList()
- val assetMgr = getActivity().assets
- val paths = assetMgr.list("country_json_50m")!!
+ val tessObjs = ArrayList()
- var tessObjs = ArrayList()
-
- // Load in 20 contries to apply a texture to
- var count = 0
- for (path in paths) {
- val stream = assetMgr.open("country_json_50m/" + path)
+ // Load in 20 countries to apply a texture to
+ for (path in paths.take(20)) {
try {
- val vecObj = VectorObject()
- vecObj.selectable = true
- val json = Okio.buffer(Okio.source(stream)).readUtf8()
- if (vecObj.fromGeoJSON(json)) {
- // Work through each individual loop
- for (thisVecObj in vecObj) {
- val loopObj = thisVecObj.deepCopy()
-
- // Center of the texture application
- val center = loopObj.center()
- val attrs = loopObj.attributes
- attrs.setDouble("veccenterx", center.x)
- attrs.setDouble("veccentery", center.y)
-
- var tessObj : VectorObject?
- if (control is GlobeController) {
- // We adjust the grid clipping size based on the latitude
- // This helps a lot near the poles. Otherwise we're way oversampling
- var thisClipGridLon = ClipGridSize
- if (abs(center.x) > 60.0/180.0 * PI)
- thisClipGridLon *= 4.0
- else if (abs(center.y) > 45.0/180.0 * PI)
- thisClipGridLon *= 2.0;
-
- // We clip the vector to a grid and then tesselate the results
- // This forms the vector closer to the globe, make it look nicer
- tessObj = loopObj.clipToGrid(Point2d(thisClipGridLon,ClipGridSize)).tesselate()
- } else {
- tessObj = loopObj.tesselate();
+ assetMgr.open("country_json_50m/$path").use { stream ->
+ Okio.source(stream).use { source ->
+ Okio.buffer(source).use { buffer ->
+ VectorObject.createFromGeoJSON(buffer.readUtf8())?.let { vecObj ->
+ vecObj.selectable = true
+
+ // Work through each individual loop
+ for (thisVecObj in vecObj) {
+ val loopObj = thisVecObj.deepCopy()
+
+ // Center of the texture application
+ val center = loopObj.center()
+ val attrs = loopObj.attributes
+ attrs.setDouble("veccenterx", center.x)
+ attrs.setDouble("veccentery", center.y)
+
+ var thisClipGridLon = ClipGridSize
+ if (isGlobe) {
+ // We adjust the grid clipping size based on the latitude
+ // This helps a lot near the poles. Otherwise we're way oversampling
+ if (abs(center.x) > 60.0 / 180.0 * PI)
+ thisClipGridLon *= 4.0
+ else if (abs(center.y) > 45.0 / 180.0 * PI)
+ thisClipGridLon *= 2.0;
+
+ }
+ loopObj.clipToGrid(Point2d(thisClipGridLon, ClipGridSize))?.tesselate()?.let {
+ tessObjs.add(it)
+ }
+ }
+ }
}
-
- if (tessObj != null)
- tessObjs.add(tessObj)
}
}
+ } catch (e: Exception) {
+ Log.e(javaClass.simpleName, "Failed to load $path", e)
}
- catch (e: Exception)
- {
- }
-
- if (count++ > 20)
- break
}
- val vecInfo = VectorInfo()
- vecInfo.setFilled(true)
- vecInfo.setTexture(tex)
- vecInfo.setTextureProjection(VectorInfo.TextureProjection.TangentPlane)
- vecInfo.setTexScale(16.0, 16.0)
- vecInfo.setColor(Color.WHITE)
+ val vecInfo = VectorInfo().apply {
+ setFilled(true)
+ setTexture(tex)
+ // todo: TextureProjection.Screen doesn't work?
+ setTextureProjection(if (isGlobe) VectorInfo.TextureProjection.TangentPlane else VectorInfo.TextureProjection.None)
+ setTexScale(16.0, 16.0)
+ setColor(Color.WHITE)
+ }
// Add all the vectors at once to be more efficient
// The geometry gets grouped together, which is nice and fast
- return control.addVectors(tessObjs, vecInfo, RenderControllerInterface.ThreadMode.ThreadAny)
+ return control.addVectors(tessObjs, vecInfo, ThreadMode.ThreadAny)
}
var baseCase : CartoLightTestCase? = null
override fun setUpWithMap(mapVC: MapController?): Boolean {
- baseCase = CartoLightTestCase(getActivity())
+ baseCase = CartoLightTestCase(activity)
baseCase?.setUpWithMap(mapVC)
buildCountries(mapVC!!)
+ mapVC.animatePositionGeo(-Math.PI/2,0.0,1.0,1.0)
return true
}
override fun setUpWithGlobe(globeVC: GlobeController?): Boolean {
- baseCase = CartoLightTestCase(getActivity())
+ baseCase = CartoLightTestCase(activity)
baseCase?.setUpWithGlobe(globeVC)
buildCountries(globeVC!!)
+ globeVC.animatePositionGeo(-Math.PI/2,0.0,1.0,1.0)
return true
}
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/VectorMBTilesTestCase.kt b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/VectorMBTilesTestCase.kt
index d6afd45e09..39095b2e2e 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/VectorMBTilesTestCase.kt
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/VectorMBTilesTestCase.kt
@@ -23,8 +23,8 @@ import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.graphics.Color
+import android.os.Handler
import com.mousebird.maply.*
-import com.mousebirdconsulting.autotester.ConfigOptions
import com.mousebirdconsulting.autotester.Framework.MaplyTestCase
import java.io.File
import java.io.FileNotFoundException
@@ -61,7 +61,7 @@ class VectorMBTilesTestCase : MaplyTestCase {
// The fetcher fetches tile from the MBTiles file
// The fetcher fetches tile from the MBTiles file
- val mbTileFetcher = MBTileFetcher(mbTiles)
+ val mbTileFetcher = MBTileFetcher(control, mbTiles)
// Set up the parameters to match the MBTile file
// Set up the parameters to match the MBTile file
@@ -93,7 +93,7 @@ class VectorMBTilesTestCase : MaplyTestCase {
}
// The fetcher fetches tile from the MBTiles file
- val mbTileFetcher = MBTileFetcher(mbTiles)
+ val mbTileFetcher = MBTileFetcher(control, mbTiles)
// Set up the parameters to match the MBTile file
val params = SamplingParams()
@@ -121,7 +121,7 @@ class VectorMBTilesTestCase : MaplyTestCase {
fun setupFranceVector(control: BaseController) {
val mbTileFile = getFile("mbtiles", "mbtiles/France.mbtiles", "France.mbtiles")
- val fetcher = MBTileFetcher(mbTileFile)
+ val fetcher = MBTileFetcher(control, mbTileFile)
// Sampling params define how the globe is broken up, including the depth
var params = SamplingParams()
@@ -143,6 +143,19 @@ class VectorMBTilesTestCase : MaplyTestCase {
val loader = QuadPagingLoader(params, fetcher.tileInfo, interp, control)
loader.setTileFetcher(fetcher)
this.loader = loader
+
+ // Shut down the loader after a short period
+ // Useful for debugging
+// val handler = Handler()
+// handler.postDelayed({
+// loader.shutdown()
+// this.loader = null
+//
+// val handler = Handler()
+// handler.postDelayed({
+// this.setupFranceVector(control)
+// }, 1000)
+// }, 500)
}
fun setupShapefile(control: BaseController) {
@@ -155,7 +168,7 @@ class VectorMBTilesTestCase : MaplyTestCase {
val vecInfo = VectorInfo()
vecInfo.setColor(Color.MAGENTA)
vecInfo.drawPriority = 1000000
- control.addVector(shpData,vecInfo,RenderControllerInterface.ThreadMode.ThreadAny)
+ control.addVector(shpData, vecInfo, RenderControllerInterface.ThreadMode.ThreadAny)
}
var baseCase: GeographyClass? = null
diff --git a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/WideVectorsTestCase.java b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/WideVectorsTestCase.java
index 0268283ce7..f1bce1d276 100644
--- a/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/WideVectorsTestCase.java
+++ b/android/apps/AutoTesterAndroid/app/src/main/java/com/mousebirdconsulting/autotester/TestCases/WideVectorsTestCase.java
@@ -3,6 +3,7 @@
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Color;
+import android.util.Log;
import com.mousebird.maply.ComponentObject;
import com.mousebird.maply.GlobeController;
@@ -10,6 +11,7 @@
import com.mousebird.maply.MapController;
import com.mousebird.maply.BaseController;
import com.mousebird.maply.MaplyTexture;
+import com.mousebird.maply.Point2d;
import com.mousebird.maply.RenderController;
import com.mousebird.maply.VectorInfo;
import com.mousebird.maply.VectorObject;
@@ -31,53 +33,71 @@ public WideVectorsTestCase(Activity activity) {
this.implementation = TestExecutionImplementation.Both;
}
- void addGeoJSON(BaseController baseController, String name) {
- // Build a dashed pattern
- LinearTextureBuilder texBuild = new LinearTextureBuilder();
- int[] pattern = new int[2];
- pattern[0] = 4;
- pattern[1] = 4;
- texBuild.setPattern(pattern);
- Bitmap patternImage = texBuild.makeImage();
- RenderController.TextureSettings texSet = new RenderController.TextureSettings();
- texSet.wrapU = true; texSet.wrapV = true;
- MaplyTexture tex = baseController.addTexture(patternImage, texSet, RenderController.ThreadMode.ThreadCurrent);
+ ArrayList addGeoJSON(BaseController baseController, String name,
+ float width, int drawPriority, int color,
+ boolean usePattern, double edge) {
+ MaplyTexture tex = null;
+ if (usePattern) {
+ // Build a dashed pattern
+ LinearTextureBuilder texBuild = new LinearTextureBuilder();
+ int[] pattern = new int[2];
+ pattern[0] = 4;
+ pattern[1] = 4;
+ texBuild.setPattern(pattern);
+ Bitmap patternImage = texBuild.makeImage();
+ RenderController.TextureSettings texSet = new RenderController.TextureSettings();
+ texSet.wrapU = true;
+ texSet.wrapV = true;
+ tex = baseController.addTexture(patternImage, texSet, RenderController.ThreadMode.ThreadCurrent);
+ }
WideVectorInfo wideVecInfo = new WideVectorInfo();
- wideVecInfo.setColor(Color.BLUE);
- wideVecInfo.setLineWidth(20.0f);
- wideVecInfo.setTexture(tex);
- wideVecInfo.setTextureRepeatLength(8.0);
+ wideVecInfo.setColor(color);
+ wideVecInfo.setLineWidth(width);
+ wideVecInfo.setDrawPriority(drawPriority);
+ if (tex != null) {
+ wideVecInfo.setTexture(tex);
+ wideVecInfo.setTextureRepeatLength(8.0);
+ }
+
+ wideVecInfo.setEdgeFalloff(edge);
VectorInfo vecInfo = new VectorInfo();
vecInfo.setLineWidth(4.0f);
vecInfo.setColor(Color.BLACK);
- ArrayList compObjs = new ArrayList();
-
try {
InputStream stream = getActivity().getAssets().open("wide_vecs/" + name);
String json = Okio.buffer(Okio.source(stream)).readUtf8();
VectorObject vecObj = new VectorObject();
vecObj.fromGeoJSON(json);
+ vecObj = vecObj.subdivideToGlobeGreatCircle(0.0001f);
ComponentObject compObj = baseController.addVector(vecObj, vecInfo, RenderController.ThreadMode.ThreadAny);
- compObjs.add(compObj);
ComponentObject compObj2 = baseController.addWideVector(vecObj, wideVecInfo, RenderController.ThreadMode.ThreadAny);
+
+ ArrayList compObjs = new ArrayList<>();
+ compObjs.add(compObj);
compObjs.add(compObj2);
+ return compObjs;
} catch (Exception e) {
+ Log.e(getClass().getSimpleName(), "Failed", e);
+ return null;
}
}
void wideVecTest(BaseController baseController) {
-// addGeoJSON(baseController, "sawtooth.geojson");
- addGeoJSON(baseController, "mowing-lawn.geojson");
- addGeoJSON(baseController, "spiral.geojson");
- addGeoJSON(baseController, "square.geojson");
- addGeoJSON(baseController, "track.geojson");
- addGeoJSON(baseController, "uturn2.geojson");
- addGeoJSON(baseController, "testJson.geojson");
+ addGeoJSON(baseController, "mowing-lawn.geojson", 20.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+ addGeoJSON(baseController, "spiral.geojson", 20.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+ addGeoJSON(baseController, "square.geojson", 20.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+ addGeoJSON(baseController, "line.geojson", 100.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+ addGeoJSON(baseController, "line.geojson", 60.0f, VectorInfo.VectorPriorityDefault+10, Color.RED, true, 1);
+ addGeoJSON(baseController, "track.geojson", 20.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+ addGeoJSON(baseController, "uturn2.geojson", 20.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+ addGeoJSON(baseController, "testJson.geojson", 20.0f, VectorInfo.VectorPriorityDefault, Color.BLUE, true, 1);
+
+ addGeoJSON(baseController, "sawtooth.geojson", 50.0f, VectorInfo.VectorPriorityDefault, Color.RED, false,20);
}
@Override
@@ -87,6 +107,7 @@ public boolean setUpWithMap(MapController mapVC) throws Exception {
wideVecTest(mapVC);
+ mapVC.animatePositionGeo(Point2d.FromDegrees(-100,40),0.5,0.0,1.0);
return true;
}
diff --git a/android/apps/AutoTesterAndroid/build.gradle b/android/apps/AutoTesterAndroid/build.gradle
index a9fee38a6e..7cc0c6476b 100644
--- a/android/apps/AutoTesterAndroid/build.gradle
+++ b/android/apps/AutoTesterAndroid/build.gradle
@@ -7,7 +7,7 @@ buildscript {
google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.0.1'
+ classpath 'com.android.tools.build:gradle:4.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
diff --git a/android/apps/AutoTesterAndroid/gradle/wrapper/gradle-wrapper.properties b/android/apps/AutoTesterAndroid/gradle/wrapper/gradle-wrapper.properties
index 3cf147cd11..5f978e2dae 100644
--- a/android/apps/AutoTesterAndroid/gradle/wrapper/gradle-wrapper.properties
+++ b/android/apps/AutoTesterAndroid/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu Aug 06 09:59:49 PDT 2020
+#Tue Feb 23 10:02:53 PST 2021
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
diff --git a/android/library/maply/CMakeLists.txt b/android/library/maply/CMakeLists.txt
index 3e5ee4325e..4bb6f04a71 100644
--- a/android/library/maply/CMakeLists.txt
+++ b/android/library/maply/CMakeLists.txt
@@ -46,6 +46,7 @@ include("${LOCALLIBS_DIR}/nanopb/wgmaplyCMakeLists.txt")
include("${LOCALLIBS_DIR}/shapefile/wgmaplyCMakeLists.txt")
include("${LOCALLIBS_DIR}/glues/wgmaplyCMakeLists.txt")
include("${LOCALLIBS_DIR}/libjson/wgmaplyCMakeLists.txt")
+include("${LOCALLIBS_DIR}/lodepng/wgmaplyCMakeLists.txt")
include("${COMMON_DIR}/WhirlyGlobeLib/src/CMakeLists.txt")
include("${WGLIBANDROID}/src/CMakeLists.txt")
include("${JNIDIR}/CMakeLists.txt")
diff --git a/android/library/maply/WhirlyGlobeLib/include/ComponentManager_Android.h b/android/library/maply/WhirlyGlobeLib/include/ComponentManager_Android.h
index 3a17a83ef9..a6783131de 100644
--- a/android/library/maply/WhirlyGlobeLib/include/ComponentManager_Android.h
+++ b/android/library/maply/WhirlyGlobeLib/include/ComponentManager_Android.h
@@ -40,9 +40,10 @@ class ComponentManager_Android : public ComponentManager
virtual void removeComponentObjects(PlatformThreadInfo *threadInfo,const SimpleIDSet &compIDs,ChangeSet &changes) override;
protected:
- virtual ComponentObjectRef makeComponentObject() override;
+ virtual ComponentObjectRef makeComponentObject(const Dictionary *desc = nullptr) override;
jobject compManagerObj;
jmethodID objectsRemovedMethod;
};
+typedef std::shared_ptr ComponentManager_AndroidRef;
}
diff --git a/android/library/maply/WhirlyGlobeLib/include/Dictionary_Android.h b/android/library/maply/WhirlyGlobeLib/include/Dictionary_Android.h
index 29fa66a295..5901b688fe 100644
--- a/android/library/maply/WhirlyGlobeLib/include/Dictionary_Android.h
+++ b/android/library/maply/WhirlyGlobeLib/include/Dictionary_Android.h
@@ -1,9 +1,8 @@
-/*
- * Dictionary.h
+/* Dictionary.h
* WhirlyGlobeLib
*
* Created by Steve Gifford on 12/16/13.
- * Copyright 2011-2013 mousebird consulting
+ * Copyright 2011-2021 mousebird consulting
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +14,6 @@
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
- *
*/
#import