diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 2000b669..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,70 +0,0 @@ -version: 2.1 -jobs: - build: - docker: - - image: cimg/openjdk:17.0.2 - working_directory: /tmp - steps: - - run: - name: Download Apache Tomcat - command: | - wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz - tar -xzf apache-tomcat-9.0.34.tar.gz - mv apache-tomcat-9.0.34 tomcat - rm -rf tomcat/webapps/ROOT - rm -rf tomcat/webapps/docs - rm -rf tomcat/webapps/examples - rm -rf tomcat/webapps/host-manager - rm -rf tomcat/webapps/manager - rm -f apache-tomcat-9.0.34.tar.gz - - checkout: - path: /tmp/carma-cloud - - run: - name: Compile source - command: | - mkdir -p tomcat/webapps/carmacloud/ROOT/WEB-INF/classes - find ./carma-cloud/src -name "*.java" > sources.txt - javac -cp "tomcat/lib/servlet-api.jar:carma-cloud/lib/*" -d tomcat/webapps/carmacloud/ROOT/WEB-INF/classes @sources.txt - rm -f sources.txt - - run: - name: Configure webapp - command: | - mv carma-cloud/end_cc.sh tomcat - mv carma-cloud/start_cc.sh tomcat - mkdir -p tomcat/work/carmacloud/xodr - mkdir -p tomcat/work/carmacloud/validate/xodr - mv carma-cloud/web/WEB-INF/web.xml tomcat/webapps/carmacloud/ROOT/WEB-INF/ - mv carma-cloud/web/WEB-INF/log4j2.properties tomcat/webapps/carmacloud/ROOT/WEB-INF/classes/ - mv -n carma-cloud/web/* tomcat/webapps/carmacloud/ROOT/ - sudo mv carma-cloud/lib/libcs2cswrapper.so /usr/lib/ - mv carma-cloud/lib tomcat/webapps/carmacloud/ROOT/WEB-INF/ - touch tomcat/webapps/carmacloud/event.csv - mv carma-cloud/osmbin/rop.csv tomcat/webapps/carmacloud/ - mv carma-cloud/osmbin/storm.csv tomcat/webapps/carmacloud/ - mv carma-cloud/osmbin/units.csv tomcat/webapps/carmacloud/ - gunzip carma-cloud/osmbin/*.gz - mv carma-cloud/osmbin tomcat/webapps/carmacloud/ - java -cp tomcat/webapps/carmacloud/ROOT/WEB-INF/classes/:tomcat/lib/servlet-api.jar cc.ws.UserMgr ccadmin admin_testpw > tomcat/webapps/carmacloud/user.csv - rm -rf carma-cloud - - run: - name: Configure network and set privileges - command: | - sed -i '/<\/Engine>/ i \ \ \ \ \ \n ' tomcat/conf/server.xml - echo -e '127.0.0.1\tcarmacloud' | sudo tee -a /etc/hosts - sudo groupadd tomcat - sudo useradd -g tomcat -m tomcat - chmod g+r tomcat/conf/* - chmod -R o-rwx tomcat/webapps/* - sudo chown -R root:tomcat tomcat - sudo chown -R tomcat:tomcat tomcat/logs - sudo chown -R tomcat:tomcat tomcat/temp - sudo chown -R tomcat:tomcat tomcat/work - sudo mv tomcat /opt/ - - run: - name: Start Tomcat and verify deployment - command: | - sudo /opt/tomcat/bin/catalina.sh start - sleep 10 - if [[ `sudo grep "startup in" /opt/tomcat/logs/catalina.out | wc -l` -ne "1" ]]; then exit 1; fi - if [[ `wget -O - http://carmacloud:8080 | grep "CARMAcloud Login" | wc -l` -ne "1" ]]; then exit 2; fi - if [[ `wget -O - --post-data="uname=ccadmin&pword=admin_testpw" http://carmacloud:8080/api/auth/login | grep "token" | wc -l` -ne "1" ]]; then exit 3; fi diff --git a/.github/workflows/deployment_test.yml b/.github/workflows/deployment_test.yml new file mode 100644 index 00000000..ef9c9b0f --- /dev/null +++ b/.github/workflows/deployment_test.yml @@ -0,0 +1,59 @@ +on: + push: + branches: + - develop + - master + - "release/*" + pull_request: + types: [opened, synchronize, reopened] +name: Deployment Test +jobs: + deployment_test: + runs-on: ubuntu-latest + container: + image: ubuntu:22.04 + defaults: + run: + shell: bash + steps: + - name: Install git + # Installing git for checkout action + run: | + apt update + export DEBIAN_FRONTEND=noninteractive + apt-get install -y git + - name: Checkout + uses: actions/checkout@v4 + with: + # Disabling shallow clone is recommended for improving relevancy of reporting + fetch-depth: 0 + path: ${{ github.event.repository.name }} + submodules: recursive + - name: Move source code + run: mv $GITHUB_WORKSPACE/${{ github.event.repository.name }} /home/carma-cloud + - name: Install dependencies + run: | + cd /home/carma-cloud/scripts + ./install_dependencies.sh + - name: Build + run: | + cd /home/carma-cloud/scripts + ./build.sh + - name: Configure network and set privileges + run: | + echo -e '127.0.0.1\tcarmacloud' | tee -a /etc/hosts + groupadd tomcat + useradd -g tomcat -m tomcat + chmod g+r /opt/tomcat/conf/* + chmod -R o-rwx /opt/tomcat/webapps/* + chown -R root:tomcat /opt/tomcat + chown -R tomcat:tomcat /opt/tomcat/logs + chown -R tomcat:tomcat /opt/tomcat/temp + chown -R tomcat:tomcat /opt/tomcat/work + - name: Start Tomcat and verify deployment + run: | + /opt/tomcat/bin/catalina.sh start + sleep 10 + if [[ `grep "startup in" /opt/tomcat/logs/catalina.out | wc -l` -ne "1" ]]; then exit 1; fi + if [[ `wget -O - http://carmacloud:8080 | grep "CARMAcloud Login" | wc -l` -ne "1" ]]; then exit 2; fi + if [[ `wget -O - --post-data="uname=ccadmin&pword=admin_testpw" http://carmacloud:8080/api/auth/login | grep "token" | wc -l` -ne "1" ]]; then exit 3; fi diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..6af6ad1b --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,9 @@ +name: Docker build +on: + pull_request: + types: [opened, synchronize, reopened] +jobs: + docker: + uses: usdot-fhwa-stol/actions/.github/workflows/docker.yml@main + with: + runner: ubuntu-latest diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml new file mode 100644 index 00000000..3056aca7 --- /dev/null +++ b/.github/workflows/dockerhub.yml @@ -0,0 +1,17 @@ +name: Docker Hub build +on: + push: + branches: + - develop + - master + - "release/*" + tags: + - "carma-system-*" +jobs: + dockerhub: + uses: usdot-fhwa-stol/actions/.github/workflows/dockerhub.yml@main + secrets: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + with: + runner: ubuntu-latest diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..b9ec0e61 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM ubuntu:22.04 +# update package manager and install prerequisites +COPY scripts/install_dependencies.sh /home/carma-cloud/scripts/install_dependencies.sh +RUN /home/carma-cloud/scripts/install_dependencies.sh +COPY src /home/carma-cloud/src +COPY lib /home/carma-cloud/lib +COPY web /home/carma-cloud/web +COPY osmbin /home/carma-cloud/osmbin +COPY *.sh /home/carma-cloud/ +COPY scripts/build.sh /home/carma-cloud/scripts/build.sh + +# download carma-cloud source +RUN /home/carma-cloud/scripts/build.sh +ENTRYPOINT [ "/opt/tomcat/bin/catalina.sh", "run" ] + diff --git a/README.md b/README.md index a5e5e423..0db937d7 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,22 @@ Example: > x(n-2)0,y(n-2)0,x(n-2)1,y(n-2)1,x(n-2)2,y(n-2)2,x(n-2)3,y(n-2)3 > x(n-1)0,y(n-1)0,x(n-1)1,y(n-1)1,x(n-1)2,y(n-1)2,x(n-1)3,y(n-1)3 +## Testing Considerations + +Upon startup, CARMA Cloud automatically creates traffic controls for later sending to CARMA platform by reading XML OpenDrive files placed in its XODR work folder, e.g. /work/xodr. This can result in thousands of traffic controls that are mostly uninteresting for testing purposes. The cc.util.FilterControls command-line application accepts a list of traffic control identifiers, and creates a much smaller and more manageable subset of traffic controls that can be saved along with their respective testing scenarios. + +After CARMA Cloud has been started for the first time in a testing scenario, XODR files will have been processed, and the tester can login to CARMA Cloud to add traffic controls for his testing needs. Executing an ls -lrt in the traffic controls folder, typically /work/carmacloud/traf_ctrls, will put the newly created traffic controls at the bottom of the list. The hexadecimal encoded text for the 16-byte traffic control ids to be kept can then be derived from three levels of folder paths and the traffic control filename. + +The FilterControls application takes the source work folder name, the destination work folder name, and a space-separated list of at least one 16-byte hexadecimal encoded text traffic control id. +``` +/bin/java -cp :/keccakj.jar cc.util.FilterControls ... +``` +For example: +``` +/bin/java -cp :/keccakj.jar cc.util.FilterControls /work/carmacloud /work/filtered 00109ab6d542f12ca8942b436c9c9d8d +``` +FilterControls creates the destination folder structure containing geolanes, linearcs, td, and traf_ctrls subfolders. The filtered traffic control files can then be saved with the appropriate testing scenarios. Both the td and traf_ctrls folders should always contain at least one file, and it is also normal under some circumstances that the geolanes and linearcs folders may contain no files. + ## Contribution Welcome to the CARMA contributing guide. Please read this guide to learn about our development process, how to propose pull requests and improvements, and how to build and test your changes to this project. [CARMA Contributing Guide](Contributing.md) diff --git a/SendTimeSyncMessage.py b/SendTimeSyncMessage.py new file mode 100644 index 00000000..56fc46a1 --- /dev/null +++ b/SendTimeSyncMessage.py @@ -0,0 +1,18 @@ +import http.client +import json +import requests + +connection = http.client.HTTPConnection("localhost:8080") +# headers = {'Content-type': 'application/json'} +foo = {'timestep': 100, 'seq': 1} + +connection.request("POST", "/carmacloud/simulation/dumb", json.dumps(foo)) +x = requests.post("http://127.0.0.1:8080/carmacloud/simulation/dumb", json.dumps(foo)) +print(x) + +response = connection.getresponse() +print(response.read().decode()) + +connection.request("GET", '/api/rop/details') +response = connection.getresponse() +print(response.read().decode()) \ No newline at end of file diff --git a/carma-cloud-config/log4j2.properties b/carma-cloud-config/log4j2.properties new file mode 100644 index 00000000..642c6e80 --- /dev/null +++ b/carma-cloud-config/log4j2.properties @@ -0,0 +1,18 @@ +status = warn +monitorInterval = 300 + +appender.rolling.type = RollingFile +appender.rolling.name = LogToRollingFile +appender.rolling.fileName = /opt/tomcat/logs/carmacloud.log +appender.rolling.filePattern = /opt/tomcat/logs/carmacloud-%d{yyyyMMdd}.log.gz +appender.rolling.layout.type = PatternLayout +appender.rolling.layout.pattern = [%-5level %d{HH:mm:ss.SSS} [%c{1}] - %msg%n +appender.rolling.policies.type = Policies +appender.rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.rolling.policies.time.interval = 1 +appender.rolling.policies.time.modulate = false +appender.rolling.strategy.type = DefaultRolloverStrategy +appender.rolling.strategy.max = 366 + +rootLogger.level = debug +rootLogger.appenderRef.stdout.ref = LogToRollingFile diff --git a/carma-cloud-config/web.xml b/carma-cloud-config/web.xml new file mode 100644 index 00000000..7fd91667 --- /dev/null +++ b/carma-cloud-config/web.xml @@ -0,0 +1,345 @@ + + + + +CARMAcloud + + login.html + + + + login.html + + + + RegHub + cc.ws.RegHub + + -1 + + + + RegHub + /carmacloud/v2xhub/* + + + + + SimFederate + cc.ws.SimFederate + + + OPTIONAL: Logical flag to specify real world time or simulation time mode. Not present or false indicates real world time mode. + simulation + true + + + + OPTIONAL: Required when simulation is true. Network address for simulation ambassador. + ambassador + 172.2.0.2 + + + + OPTIONAL: Required when simulation is true. Simulation identifier for this CARMA Cloud instance. + id + carma-cloud-sim1 + + + + OPTIONAL: Required when simulation is true. URL where ambassador sends time sync messages. + url + http://172.2.0.47:8080/carmacloud/simulation + + + 1 + + + + SimFederate + /carmacloud/simulation/* + + + + + SessMgr + cc.ws.SessMgr + + + OPTIONAL: session timeout in milliseconds + timeout + 18000000 + + + 2 + + + + + UserMgr + cc.ws.UserMgr + + + REQUIRED: path to user credential file + pwdfile + /opt/tomcat/webapps/carmacloud/user.csv + + + 3 + + + + UserMgr + /api/auth/* + + + + + CtrlTiles + cc.ws.CtrlTiles + + + REQUIRED: path to .xodr file containing road defintions + xodrdir + /opt/tomcat/work/carmacloud/xodr/ + + + + REQUIRED: + linearcdir + /opt/tomcat/work/carmacloud/linearcs/ + + + + REQUIRED: format string for tiled data filenames + tileddataformat + /opt/tomcat/work/carmacloud/td/%d/ctrls_%d_%d_%d.bin + + + + REQUIRED: format string for tiled data filenames + ctrldir + /opt/tomcat/work/carmacloud/traf_ctrls + + + + REQUIRED: zoom level used to create tiled data + zoom + 17 + + + + REQUIRED: zoom level used to create tiled data + explodestep + 0.06 + + + + REQUIRED: zoom level used to create tiled data + combinetol + 0.1 + + + + REQUIRED: file path for units + units + /opt/tomcat/webapps/carmacloud/units.csv + + + + REQUIRED: file path for units + units + /opt/tomcat/webapps/carmacloud/units.csv + + + 4 + + + + CtrlTiles + /api/ctrl/* + + + + + TcmReq + cc.ws.TcmReqServlet + + + OPTIONAL: number of cm desired inbetween each point in xml + xmldist + 1500 + + + 4 + + + + TcmReq + /carmacloud/tcmreq/* + + + + + TcmAck + cc.ws.TcmAckServlet + + 4 + + + + TcmAck + /carmacloud/tcmack/* + + + + + GeoLanes + cc.ws.GeoLanes + + + dir + /opt/tomcat/work/carmacloud/geolanes + + + 4 + + + + GeoLanes + /api/geolanes/* + + + + + WxPoly + cc.ws.WxPoly + + 4 + + + + WxPoly + /api/wxpoly/* + + + + ValidateXodrTiles + cc.ws.ValidateXodrTiles + + + REQUIRED: path to .xodr file containing road defintions + xodrdir + /opt/tomcat/work/carmacloud/validate/xodr/ + + + + REQUIRED: + linearcdir + /opt/tomcat/work/carmacloud/validate/linearcs/ + + + + REQUIRED: format string for tiled data filenames + tileddataformat + /opt/tomcat/work/carmacloud/validate/td/%d/ctrls_%d_%d_%d.bin + + + + REQUIRED: format string for tiled data filenames + ctrldir + /opt/tomcat/work/carmacloud/validate/traf_ctrls + + + + REQUIRED: zoom level used to create tiled data + zoom + 17 + + + + REQUIRED: zoom level used to create tiled data + explodestep + 0.06 + + + + REQUIRED: zoom level used to create tiled data + combinetol + 0.1 + + + 4 + + + + ValidateXodrTiles + /api/vctrl/* + + + + + IHP + cc.ihp.IHP + + + pfile + /opt/tomcat/work/carmacloud/ihp/parameters.csv + + + + cfile + /opt/tomcat/work/carmacloud/ihp/corridor.csv + + + + dfile + /opt/tomcat/work/carmacloud/ihp/detectors.json + + + + basedir + /opt/tomcat/work/carmacloud/ihp/ + + + 4 + + + + IHP + /api/ihp/* + + + + + RSU + cc.ws.RSUServlet + + + REQUIRED: Duration to store the received BSM request. Unit of second + bsmReqDuration + 5 + + + + REQUIRED: Periodically checking if the BSM is stored longer than the specified duration. Unit of second + bsmReqCheckPeriod + 2 + + + + REQUIRED: Bounding box radius in meters + boundingBoxRadius + 20 + + + 4 + + + + RSU + /carmacloud/rsu/* + + + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..b5cdce01 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: "2" +services: + carma-cloud: + image: test + network_mode: host + extra_hosts: + carmacloud: "127.0.0.1" + container_name: carma-cloud + volumes: + - ./carmacloudvol/logs:/opt/tomcat/logs + - ./carmacloudvol/work/carmacloud/validate/xodr:/opt/tomcat/work/carmacloud/validate/xodr + - ./carmacloudvol/work/carmacloud/xodr:/opt/tomcat/work/carmacloud/xodr + - ./carma-cloud-config/server.xml:/opt/tomcat/conf/server.xml + - ./carma-cloud-config/log4j2.properties:/opt/tomcat/webapps/carmacloud/ROOT/WEB-INF/log4j2.properties diff --git a/lib/libcs2cswrapper.so b/lib/libcs2cswrapper.so deleted file mode 100644 index 6f498389..00000000 Binary files a/lib/libcs2cswrapper.so and /dev/null differ diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 00000000..1cf502ff --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# exit on errors +set -ex +export JAVA_HOME="/opt/jdk" +export TOMCAT_HOME="/opt/tomcat" + + +cd /home/carma-cloud/src/cc/geosrv +gcc -c -std=c11 -fPIC -Wall -I "${JAVA_HOME}/include/" -I "${JAVA_HOME}/include/linux/" -I /tmp/proj/src/ cs2cswrapper.c +gcc -shared cs2cswrapper.o -lproj -o /usr/local/lib/libcs2cswrapper.so + +mkdir -p "${TOMCAT_HOME}/webapps/carmacloud/ROOT" +cd /home +mv carma-cloud/web/* ${TOMCAT_HOME}/webapps/carmacloud/ROOT +mkdir -p ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes +cd /home/carma-cloud +find ./src -name "*.java" > sources.txt +/opt/jdk/bin/javac -cp ${TOMCAT_HOME}/lib/servlet-api.jar:lib/commons-compress-1.18.jar:lib/javax.json.jar:lib/json-20210307.jar:lib/keccakj.jar:lib/log4j-api-2.16.0.jar:lib/vector_tile.jar -d ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes @sources.txt +rm sources.txt +gunzip osmbin/*.gz +mv lib ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF +mv osmbin/rop.csv ${TOMCAT_HOME}/webapps/carmacloud +mv osmbin/storm.csv ${TOMCAT_HOME}/webapps/carmacloud +mv osmbin/units.csv ${TOMCAT_HOME}/webapps/carmacloud +mv osmbin ${TOMCAT_HOME}/webapps/carmacloud +mv ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/log4j2.properties ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes +touch ${TOMCAT_HOME}/webapps/carmacloud/event.csv +mkdir -p ${TOMCAT_HOME}/work/carmacloud/xodr +mkdir -p ${TOMCAT_HOME}/work/carmacloud/validate/xodr +/opt/jdk/bin/java -cp ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes/:${TOMCAT_HOME}/lib/servlet-api.jar cc.ws.UserMgr ccadmin admin_testpw > ${TOMCAT_HOME}/webapps/carmacloud/user.csv +sed -i 's/appBase="webapps"/appBase="webapps\/carmacloud"/g' ${TOMCAT_HOME}/conf/server.xml +echo "JAVA_HOME=${JAVA_HOME}" > ${TOMCAT_HOME}/bin/setenv.sh diff --git a/scripts/install_dependencies.sh b/scripts/install_dependencies.sh new file mode 100755 index 00000000..ef1a5836 --- /dev/null +++ b/scripts/install_dependencies.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# exit on errors +set -ex +apt-get update -y +apt-get install -y build-essential cmake git wget pkg-config sqlite3 libcurl4-openssl-dev libsqlite3-dev libtiff5-dev openjdk-21-jdk +# download geodesy projection library source and build +cd /tmp +wget -q https://download.osgeo.org/proj/proj-9.3.0.tar.gz +tar -xzf proj-9.3.0.tar.gz +rm proj-9.3.0.tar.gz +mv proj-9.3.0 proj +mkdir -p proj/build +cd /tmp/proj/build +cmake .. +cmake --build . && \ +cmake --build . --target install && \ +ldconfig +# download apache tomcat +cd /tmp +wget -q https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.83/bin/apache-tomcat-9.0.83.tar.gz +tar -xzf apache-tomcat-9.0.83.tar.gz +rm apache-tomcat-9.0.83.tar.gz +mv apache-tomcat-9.0.83 tomcat +#sed -i 's/appBase="webapps"/appBase="webapps\/carmacloud"/g' tomcat/conf/server.xml +rm -r tomcat/webapps/* +mv tomcat /opt + +# download and install JDK 21 +cd /tmp +wget --no-check-certificate -q https://download.java.net/java/GA/jdk21.0.1/415e3f918a1f4062a0074a2794853d0d/12/GPL/openjdk-21.0.1_linux-x64_bin.tar.gz +tar -xzf openjdk-21.0.1_linux-x64_bin.tar.gz +mv jdk-21.0.1 /opt/jdk +rm openjdk-21.0.1_linux-x64_bin.tar.gz diff --git a/src/cc/ctrl/TcmReqParser2.java b/src/cc/ctrl/TcmReqParser2.java index 201322d0..782655bf 100644 --- a/src/cc/ctrl/TcmReqParser2.java +++ b/src/cc/ctrl/TcmReqParser2.java @@ -32,6 +32,14 @@ public void startElement(String sUri, String sLocalName, { switch (sQname) { + case "TrafficControlRequest": + { + String sVal; + m_nPort = (sVal = iAtt.getValue("port")) != null ? Integer.parseInt(sVal) : m_nPort; + m_bList = (sVal = iAtt.getValue("list")) != null ? Boolean.parseBoolean(sVal) : m_bList; + break; + } + case "bounds": { m_oBounds = new TcBounds(); @@ -40,11 +48,8 @@ public void startElement(String sUri, String sLocalName, m_oReq.m_oBounds = new ArrayList(); break; } - default: - - } } @@ -113,8 +118,8 @@ public void endElement(String sUri, String sLocalName, String sQname) default: break; } - } + public TcmReq parseRequest(InputStream oIn) throws Exception diff --git a/src/cc/geosrv/xodr/rdmk/RoadMark.java b/src/cc/geosrv/xodr/rdmk/RoadMark.java index 9ff6b8e6..4fba8307 100644 --- a/src/cc/geosrv/xodr/rdmk/RoadMark.java +++ b/src/cc/geosrv/xodr/rdmk/RoadMark.java @@ -80,6 +80,9 @@ public static RoadMark getRoadMark(double dDist, ArrayList oRoadMarks) public static int getColor(String sColor) { + if (sColor == null) + return 0; + int nIndex = COLORS.length; while (nIndex-- > 0) { diff --git a/src/cc/util/FilterControls.java b/src/cc/util/FilterControls.java new file mode 100644 index 00000000..136ea9d2 --- /dev/null +++ b/src/cc/util/FilterControls.java @@ -0,0 +1,165 @@ +package cc.util; + + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.io.IOException; +import cc.ctrl.proc.TdFeature; +import cc.ctrl.proc.TdLayer; +import cc.ctrl.CtrlIndex; +import cc.ctrl.TrafCtrl; +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author Federal Highway Administration + */ +public class FilterControls +{ + public static void main(String[] sArgs) + throws Exception + { + String sInputDir = sArgs[0]; + if (!sInputDir.endsWith("/")) + sInputDir += "/"; + String sOutputDir = sArgs[1]; + if (!sOutputDir.endsWith("/")) + sOutputDir += "/"; + Files.createDirectories(Paths.get(sOutputDir)); + Files.createDirectories(Paths.get(sOutputDir + "linearcs/direction")); + Files.createDirectories(Paths.get(sOutputDir + "linearcs/rdmks")); + Files.createDirectories(Paths.get(sOutputDir + "linearcs/pavement")); + Files.createDirectories(Paths.get(sOutputDir + "xodr/")); + Files.createDirectories(Paths.get(sOutputDir + "td/")); + Files.createDirectories(Paths.get(sOutputDir + "geolanes/")); + Files.createDirectories(Paths.get(sOutputDir + "traf_ctrls/")); + ArrayList oIds = new ArrayList(); + StringBuilder sBuf = new StringBuilder(); + for (int n = 2; n < sArgs.length; n++) + { + String sId = sArgs[n]; + sBuf.setLength(0); + sBuf.append(sId); + oIds.add(Text.fromHexString(sBuf)); + } + + Collections.sort(oIds, TrafCtrl.ID_COMP); + + Path oTdDir = Paths.get(sInputDir + "td/"); + Path oOutputTdDir = Paths.get(sOutputDir + "td/"); + Path oOutputGeoLanes = Paths.get(sOutputDir + "geolanes"); + Path oOutputCtrl = Paths.get(sOutputDir + "traf_ctrls"); + + List oPaths = Files.walk(oTdDir).filter(Files::isRegularFile).collect(Collectors.toList()); + byte[] yIdBuf = new byte[16]; + for (Path oFile : oPaths) + { + String sFilename = oFile.toString(); + ByteArrayOutputStream oBaos = new ByteArrayOutputStream(); + if (sFilename.endsWith(".bin")) // td file + { + try (DataOutputStream oOut = new DataOutputStream(new BufferedOutputStream(oBaos)); + DataInputStream oIn = new DataInputStream(new BufferedInputStream(Files.newInputStream(oFile)))) + { + while (oIn.available() > 0) + { + TdLayer oTemp = new TdLayer(oIn, false); + int nFeatures = oIn.readInt(); + for (int nIndex = 0; nIndex < nFeatures; nIndex++) + { + oIn.read(yIdBuf); + int nBytesToSkip = oIn.readInt(); + int nSearch = Collections.binarySearch(oIds, yIdBuf, TrafCtrl.ID_COMP); + if (nSearch < 0) + oIn.skipBytes(nBytesToSkip); + else + oTemp.add(new TdFeature(oIn, oTemp.m_oKeys.length * 2, yIdBuf)); + } + oTemp.write(oOut); + } + } + + } + else if (sFilename.endsWith(".ndx")) // index file + { + try (DataOutputStream oOut = new DataOutputStream(new BufferedOutputStream(oBaos)); + DataInputStream oIn = new DataInputStream(new BufferedInputStream(Files.newInputStream(oFile)))) + { + + while (oIn.available() > 0) + { + CtrlIndex oIndex = new CtrlIndex(oIn); + int nSearch = Collections.binarySearch(oIds, oIndex.m_yId, TrafCtrl.ID_COMP); + if (nSearch >= 0) + writeIndex(oIndex, oOut); + } + } + } + + if (oBaos.size() > 0) + { + String sPath = oOutputTdDir.toString() + "/" + oFile.subpath(oFile.getNameCount() - 2, oFile.getNameCount()).toString(); + Path oPath = Paths.get(sPath); + Files.createDirectories(oPath.getParent()); + try (BufferedOutputStream oOut = new BufferedOutputStream(Files.newOutputStream(oPath))) + { + oOut.write(oBaos.toByteArray()); + } + } + } + + for (byte[] yId : oIds) + { + createFilePath(sBuf, yId); + + Path oInTraf = Paths.get(sInputDir + "traf_ctrls/" + sBuf.toString() + ".bin"); + Path oOutTraf = Paths.get(oOutputCtrl.toString() + "/" + sBuf.toString() + ".bin"); + Files.createDirectories(oOutTraf.getParent()); + Files.copy(oInTraf, oOutTraf); + + oInTraf = Paths.get(sInputDir + "traf_ctrls/" + sBuf.toString() + ".bin.json"); + oOutTraf = Paths.get(oOutputCtrl.toString() + "/" + sBuf.toString() + ".bin.json"); + Files.copy(oInTraf, oOutTraf); + } + } + + + public static void createFilePath(StringBuilder sBuf, byte[] oId) + { + sBuf.setLength(0); + int nOffset = 0; + int nCount = 3; + while (nCount-- > 0) + { + Text.toHexString(oId, nOffset, nOffset + 4, sBuf); + nOffset += 4; + sBuf.append("/"); + } + Text.toHexString(oId, nOffset, nOffset + 4, sBuf); + } + + public static void writeIndex(CtrlIndex oIndex, DataOutputStream oOut) + throws IOException + { + oOut.writeInt(oIndex.m_nType); + oOut.write(oIndex.m_yId); + oOut.writeLong(oIndex.m_lStart); + oOut.writeLong(oIndex.m_lEnd); + for (int nIndex = 0; nIndex < oIndex.m_dBB.length; nIndex++) + oOut.writeInt((int)(oIndex.m_dBB[nIndex] * 100.0 + 0.5)); + } +} diff --git a/src/cc/ws/CtrlTiles.java b/src/cc/ws/CtrlTiles.java index 182c4ff9..d9d9fa97 100644 --- a/src/cc/ws/CtrlTiles.java +++ b/src/cc/ws/CtrlTiles.java @@ -89,7 +89,7 @@ public class CtrlTiles extends HttpServlet 18, //{"maxaxles"}, 18, //{"minvehocc"}, 17, //{"pavement"}, - 17, //{"debug"} + 17, //{"debug"} 18, // maxplatoonsize 18 // minplatoonhdwy }; @@ -158,7 +158,7 @@ public void init(ServletConfig oConfig) protected void doGet(HttpServletRequest oRequest, HttpServletResponse oResponse) throws ServletException, IOException { - long lNow = System.currentTimeMillis(); + long lNow = TimeSource.getInstance().currentTimeMillis(); String[] sUriParts = oRequest.getRequestURI().split("/"); int nZ = Integer.parseInt(sUriParts[sUriParts.length - 3]); int nX = Integer.parseInt(sUriParts[sUriParts.length - 2]); @@ -191,7 +191,6 @@ protected void doGet(HttpServletRequest oRequest, HttpServletResponse oResponse) double[] dClipBounds = TileUtil.getClippingBounds(nZ, nX, nY, dBounds); int nExtent = 4096; -// int nExtent = Mercator.getExtent(nZ); VectorTile.Tile.Layer.Builder oLayerBuilder = VectorTile.Tile.Layer.newBuilder(); oLayerBuilder.setVersion(2); oLayerBuilder.setExtent(nExtent); @@ -449,7 +448,7 @@ private void addControl(HttpServletRequest oReq, HttpServletResponse oRes) { try { - long lNow = System.currentTimeMillis() - 10; + long lNow = TimeSource.getInstance().currentTimeMillis() - 10; int nType = Integer.parseInt(oReq.getParameter("type")); String[] sVtypes = oReq.getParameterValues("vtypes[]"); ArrayList nVtypes = new ArrayList(sVtypes.length); @@ -523,12 +522,6 @@ private void addControl(HttpServletRequest oReq, HttpServletResponse oRes) ArrayList oCtrls = new ArrayList(); oCtrls.add(oCtrl); ProcCtrl.renderCtrls(sType, oCtrls, oCtrl.m_oFullGeo.m_oTiles); -// StringBuilder sBuf = new StringBuilder(); -// try (BufferedWriter oOut = Files.newBufferedWriter(Paths.get("/opt/tomcat/work/carmacloud/sample_tcm.xml"))) -// { -// oCtrl.getXml(sBuf, "cb9353e606e5aafa", 1, 1, 1, "1.0", true, 0); -// oOut.append(sBuf); -// } } catch (Exception oEx) { @@ -561,7 +554,7 @@ private void saveEdit(HttpServletRequest oReq, HttpServletResponse oRes) { try { - long lNow = System.currentTimeMillis(); + long lNow = TimeSource.getInstance().currentTimeMillis(); int nType = Integer.parseInt(oReq.getParameter("type")); String[] sVtypes = oReq.getParameterValues("vtypes[]"); ArrayList nVtypes = new ArrayList(sVtypes.length); @@ -635,7 +628,6 @@ private void saveEdit(HttpServletRequest oReq, HttpServletResponse oRes) { for (int[] nTile : oOriginalCtrl.m_oFullGeo.m_oTiles) { - // ProcCtrl.writeIndexFile(oCtrls, nTile[0], nTile[1]); String sIndex = String.format(g_sTdFileFormat, nTile[0], g_nZoom, nTile[0], nTile[1]) + ".ndx"; ProcCtrl.updateIndex(sIndex, oOriginalCtrl, oNewCtrl.m_lStart); } diff --git a/src/cc/ws/SimFederate.java b/src/cc/ws/SimFederate.java new file mode 100644 index 00000000..ac269ecd --- /dev/null +++ b/src/cc/ws/SimFederate.java @@ -0,0 +1,137 @@ +package cc.ws; + +import java.io.BufferedInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.json.JSONObject; +import org.json.JSONTokener; +import org.json.JSONWriter; + + +public class SimFederate extends HttpServlet implements Runnable +{ + protected static final Logger LOGGER = LogManager.getRootLogger(); + + private long m_lRetryInterval = 60000L; // default registration retry 60 seconds + private String m_sAmbassadorAddress; + private String m_sCarmaCloudId = "carma-cloud"; + private String m_sCarmaCloudUrl = ""; + private TimeSource m_oTs; + + + public SimFederate() + { + } + + + @Override + public void init() + { + ServletConfig oConf = getServletConfig(); + + String sRetry = oConf.getInitParameter("retry"); + if (sRetry != null) + m_lRetryInterval = Integer.parseInt(sRetry) * 1000L; + + String sSim = oConf.getInitParameter("simulation"); + if (sSim != null && sSim.compareToIgnoreCase("true") == 0) + { + String sAddress = oConf.getInitParameter("ambassador"); + try + { + InetAddress.getByName(sAddress); // validate network address + m_sAmbassadorAddress = sAddress; + m_oTs = new TimeSource(true); // create simulation time source + + String sId = oConf.getInitParameter("id"); + if (sId != null) + m_sCarmaCloudId = sId; + + String sUrl = oConf.getInitParameter("url"); + if (sUrl != null) + m_sCarmaCloudUrl = sUrl; + + new Thread(this).start(); // begin registration cycle + } + catch (Exception oEx) + { + LOGGER.error("SimFederate init invalid ambassador network address"); + } + } + + if (m_oTs == null) // create real world time source + m_oTs = new TimeSource(false); + } + + + @Override + public void doPost(HttpServletRequest oReq, HttpServletResponse oRes) + throws ServletException, IOException + { + JSONObject oJson; + try (BufferedInputStream oIn = new BufferedInputStream(oReq.getInputStream())) + { + oJson = new JSONObject(new JSONTokener(oIn)); + } + + long lSeq = -1L; + long lStep = -1L; + if (oJson.has("seq") && oJson.has("timestep")) + { + lSeq = oJson.getLong("seq"); + lStep = oJson.getLong("timestep"); + m_oTs.m_lSimTime = lStep; + } + LOGGER.debug(String.format("seq: %d timestep: %d timesource: %d", lSeq, lStep, m_oTs.currentTimeMillis())); + } + + + @Override + public void run() + { + boolean bRegistered = false; + while (!bRegistered) + { + try (Socket oSock = new Socket()) + { + StringBuilder sBuf = new StringBuilder(); // use JSON library to build registration message + new JSONWriter(sBuf).object().key("id").value(m_sCarmaCloudId).key("url").value(m_sCarmaCloudUrl).endObject(); + + oSock.connect(new InetSocketAddress(m_sAmbassadorAddress, 1617), 10000); + DataOutputStream oOut = new DataOutputStream(oSock.getOutputStream()); + oOut.writeUTF(sBuf.toString()); + bRegistered = true; + } + catch (Exception oEx) + { + LOGGER.error(oEx); + } + + if (!bRegistered) + { + try + { + Thread.sleep(m_lRetryInterval); + } + catch (InterruptedException oEx) + { + bRegistered = true; // container thread interrupts on shutdown + } + catch (IllegalArgumentException oEx) + { + LOGGER.error(oEx.toString()); // invalid, possibly negative, delay specified + } + } + } + } +} diff --git a/src/cc/ws/TcmReqServlet.java b/src/cc/ws/TcmReqServlet.java index a7611c14..069e7e26 100644 --- a/src/cc/ws/TcmReqServlet.java +++ b/src/cc/ws/TcmReqServlet.java @@ -90,6 +90,7 @@ public void doPost(HttpServletRequest oReq, HttpServletResponse oRes) throws ServletException, IOException { StringBuilder sReq = new StringBuilder(1024); + sReq.append(oReq.getRemoteAddr()); try (BufferedInputStream oIn = new BufferedInputStream(oReq.getInputStream())) { int nByte; @@ -107,10 +108,14 @@ public void run() { try { - long lNow = System.currentTimeMillis(); + long lNow = TimeSource.getInstance().currentTimeMillis(); String sReq = Thread.currentThread().getName(); + int nPos = sReq.indexOf('<'); + String sHost = sReq.substring(0, nPos); + sReq = sReq.substring(nPos); + TcmReqParser oReqParser; - if (sReq.indexOf("") >= 0) + if (sReq.contains("")) oReqParser = new TcmReqParser(); else oReqParser = new TcmReqParser2(); @@ -233,7 +238,7 @@ public void run() if (!oReqParser.m_bList) { - HttpURLConnection oHttpClient = (HttpURLConnection)new URL(String.format("http://tcmreplyhost:%d/tcmreply", oReqParser.m_nPort)).openConnection(); + HttpURLConnection oHttpClient = (HttpURLConnection)new URL(String.format("http://%s:%d/tcmreply", sHost, oReqParser.m_nPort)).openConnection(); oHttpClient.setFixedLengthStreamingMode(sBuf.length()); oHttpClient.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); oHttpClient.setDoOutput(true); @@ -262,7 +267,8 @@ public void run() if (oReqParser.m_bList) { - HttpURLConnection oHttpClient = (HttpURLConnection)new URL(String.format("http://tcmreplyhost:%d/tcmreply", oReqParser.m_nPort)).openConnection(); + String sUrl = String.format("http://%s:%d/tcmreply", sHost, oReqParser.m_nPort); + HttpURLConnection oHttpClient = (HttpURLConnection)new URL(sUrl).openConnection(); oHttpClient.setRequestProperty("Content-Encoding", "gzip"); oHttpClient.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); oHttpClient.setDoOutput(true); @@ -287,7 +293,7 @@ public void run() } catch (Exception oEx) { - oEx.printStackTrace(); + LOGGER.error(sUrl, oEx); } } sBuf.insert(0, ""); diff --git a/src/cc/ws/TimeSource.java b/src/cc/ws/TimeSource.java new file mode 100644 index 00000000..204f6162 --- /dev/null +++ b/src/cc/ws/TimeSource.java @@ -0,0 +1,37 @@ +package cc.ws; + + +public class TimeSource +{ + private static TimeSource g_oInstance; + + private boolean m_bSim; // determines if instance is in simulation mode + long m_lSimTime; // package private time set by simulation federate + + + protected TimeSource() + { + } + + + TimeSource(boolean bSim) + { + m_bSim = bSim; + g_oInstance = this; + } + + + public static TimeSource getInstance() + { + return g_oInstance; + } + + + public long currentTimeMillis() + { + if (m_bSim) + return m_lSimTime; + + return System.currentTimeMillis(); + } +} diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml index 4f6e164b..ed3594d5 100644 --- a/web/WEB-INF/web.xml +++ b/web/WEB-INF/web.xml @@ -25,6 +25,43 @@ + + SimFederate + cc.ws.SimFederate + + + OPTIONAL: Logical flag to specify real world time or simulation time mode. Not present or false indicates real world time mode. + simulation + false + + + + OPTIONAL: Required when simulation is true. Network address for simulation ambassador. + ambassador + ambassador-address + + + + OPTIONAL: Required when simulation is true. Simulation identifier for this CARMA Cloud instance. + id + simulation-id + + + + OPTIONAL: Required when simulation is true. URL where ambassador sends time sync messages. + url + simulation-url + + + 0 + + + + SimFederate + /carmacloud/simulation/* + + + SessMgr cc.ws.SessMgr @@ -241,54 +278,7 @@ /api/vctrl/* - - RsmServlet - cc.ws.RsmServlet - - - user - bryan - - - - pw - - 0816119b-3ea5-42ba-8a68-559875833aa1 - - - - url - https://wzdc-published-rest-api.azurewebsites.net - - - - period - 1 - - - - file - /opt/tomcat/work/carmacloud/rsm/current.csv - - - - defaultoffsets - 0.0,-0.00006 - - - - rsm-rsm-xml--tfhrc-carma-test-21--innovation-road - 0.0,-0.000031 - - - 2 - - - - RsmServlet - /api/rsm/* - - + IHP cc.ihp.IHP diff --git a/web/mapbox/satellite-streets-v11.json b/web/mapbox/satellite-streets-v11.json index 3421935b..1786d463 100644 --- a/web/mapbox/satellite-streets-v11.json +++ b/web/mapbox/satellite-streets-v11.json @@ -1 +1 @@ -{"version":8,"name":"Mapbox Satellite Streets","metadata":{"mapbox:type":"default","mapbox:origin":"satellite-streets-v11","mapbox:autocomposite":true,"mapbox:groups":{"1444855786460.0557":{"name":"Roads","collapsed":true},"1444934295202.7542":{"name":"Admin boundaries","collapsed":true},"1444855799204.86":{"name":"Bridges","collapsed":true},"1444855769305.6016":{"name":"Tunnels","collapsed":true}},"mapbox:sdk-support":{"js":"0.49.0","android":"6.5.0","ios":"4.4.0"},"mapbox:trackposition":true},"sources":{"mapbox://mapbox.satellite":{"url":"mapbox://mapbox.satellite","type":"raster","tileSize":256},"composite":{"url":"mapbox://mapbox.mapbox-streets-v8","type":"vector"}},"center":[-74.0053,40.7123],"zoom":14,"sprite":"https://cctest.data-env.com/images/sprite","glyphs":"https://cctest.data-env.com/mapbox/{fontstack}/{range}.pbf","layers":[{"id":"background","type":"background","layout":{},"paint":{"background-color":"hsl(222, 56%, 4%)"}},{"id":"satellite","type":"raster","source":"mapbox://mapbox.satellite","layout":{},"paint":{}},{"id":"tunnel-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-dasharray":[3,3],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-major-link-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-path","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-color":"hsl(0, 0%, 86%)","line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-steps","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-major-link","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 78%)","trunk_link","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-pedestrian","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","street","street_limited","tertiary"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"tunnel-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 78%)","trunk","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","motorway_link","trunk","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"ferry","type":"line","source":"composite","source-layer":"road","minzoom":8,"filter":["==",["get","type"],"ferry"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-dasharray":["step",["zoom"],["literal",[1,0]],13,["literal",[12,4]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"ferry-auto","type":"line","source":"composite","source-layer":"road","filter":["==",["get","type"],"ferry_auto"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-low","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,0.75,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],6,0.25,8,0.6,13,1,15,0]}},{"id":"road-major-link-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-path","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"path"],["step",["zoom"],["!",["match",["get","type"],["steps","sidewalk","crossing"],true,false]],16,["!=",["get","type"],"steps"]],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],13,0.5,14,1,15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-steps","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-major-link","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-pedestrian","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-street","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["interpolate",["exponential",1],["zoom"],8,"hsl(0, 0%, 96%)",10,"hsl(0, 0%, 89%)"],"line-opacity":["interpolate",["exponential",1.25],["zoom"],6,0.25,13,1,15,0]}},{"id":"road-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"road-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["step",["zoom"],["match",["get","class"],"motorway","hsl(26, 87%, 62%)","trunk","hsl(46, 80%, 60%)","hsl(46, 80%, 60%)"],9,["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"]],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","oneway"],"true"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"bridge-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["step",["zoom"],0,14,1]}},{"id":"bridge-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-major-link-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-path","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-steps","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["==",["get","structure"],"bridge"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-major-link","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-pedestrian","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","track","service"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"bridge-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"aerialway","type":"line","source":"composite","source-layer":"road","minzoom":13,"filter":["==",["get","class"],"aerialway"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(230, 10%, 74%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1]}},{"id":"admin-1-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"bevel"},"paint":{"line-color":["interpolate",["linear"],["zoom"],8,"hsl(35, 12%, 89%)",16,"hsl(230, 49%, 90%)"],"line-width":["interpolate",["linear"],["zoom"],7,3.75,12,5.5],"line-opacity":["interpolate",["linear"],["zoom"],7,0,8,0.75],"line-dasharray":[1,0],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,8,3]}},{"id":"admin-0-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{},"paint":{"line-width":["interpolate",["linear"],["zoom"],3,3.5,10,8],"line-color":["interpolate",["linear"],["zoom"],6,"hsl(35, 12%, 89%)",8,"hsl(230, 49%, 90%)"],"line-opacity":["interpolate",["linear"],["zoom"],3,0,4,0.5],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,10,2]}},{"id":"admin-1-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-dasharray":["step",["zoom"],["literal",[2,0]],7,["literal",[2,2,6,2]]],"line-width":["interpolate",["linear"],["zoom"],7,0.75,12,1.5],"line-opacity":["interpolate",["linear"],["zoom"],2,0,3,1],"line-color":"hsl(0, 0%, 0%)"}},{"id":"admin-0-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","disputed"],"false"],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"admin-0-boundary-disputed","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","disputed"],"true"],["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round"},"paint":{"line-dasharray":[1.5,1.5],"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"road-label","type":"symbol","source":"composite","source-layer":"road","minzoom":10,"filter":["step",["zoom"],["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],true,false],12,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary","pedestrian","street","street_limited"],true,false],15,["match",["get","class"],["golf","path"],false,true]],"layout":{"text-size":["interpolate",["linear"],["zoom"],10,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],10,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],9,6.5],18,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],16,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],14,13]],"text-max-angle":30,"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line","text-padding":1,"text-rotation-alignment":"map","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":0.01},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"road-number-shield","type":"symbol","source":"composite","source-layer":"road","minzoom":6,"filter":["all",["has","reflen"],["<=",["get","reflen"],6],["step",["zoom"],["==",["geometry-type"],"Point"],11,[">",["get","len"],5000],12,[">",["get","len"],2500],13,[">",["get","len"],1000],14,true]],"layout":{"text-size":9,"icon-image":["concat",["get","shield"],"-",["to-string",["get","reflen"]]],"icon-rotation-alignment":"viewport","text-max-angle":38,"symbol-spacing":["interpolate",["linear"],["zoom"],11,150,14,200],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"symbol-placement":["step",["zoom"],"point",11,"line"],"text-rotation-alignment":"viewport","text-field":["get","ref"],"text-letter-spacing":0.05},"paint":{"text-color":["match",["get","shield_text_color"],"white","hsl(0, 0%, 100%)","black","hsl(0, 0%, 7%)","yellow","hsl(50, 100%, 70%)","orange","hsl(25, 100%, 75%)","blue","hsl(230, 48%, 34%)","hsl(0, 0%, 100%)"]}},{"id":"road-exit-shield","type":"symbol","metadata":{},"source":"composite","source-layer":"motorway_junction","minzoom":14,"filter":["all",["has","reflen"],["<=",["get","reflen"],9]],"layout":{"text-field":["get","ref"],"text-size":9,"icon-image":["concat","motorway-exit-",["to-string",["get","reflen"]]],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"]},"paint":{"text-color":"hsl(0, 0%, 100%)","text-translate":[0,0]}},{"id":"waterway-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":13,"filter":["all",["match",["get","class"],["canal","river","stream"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-max-angle":30,"symbol-spacing":["interpolate",["linear",1],["zoom"],15,250,17,400],"text-size":["interpolate",["linear"],["zoom"],13,12,18,16],"symbol-placement":"line","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"natural-line-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["glacier","landform"],true,false],["==",["geometry-type"],"LineString"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"text-max-angle":30,"text-field":["coalesce",["get","name_en"],["get","name"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport"},"paint":{"text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5,"text-color":["step",["zoom"],["step",["get","sizerank"],"hsl(26, 20%, 42%)",5,"hsl(26, 25%, 32%)"],17,["step",["get","sizerank"],"hsl(26, 20%, 42%)",13,"hsl(26, 25%, 32%)"]]}},{"id":"natural-point-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["dock","glacier","landform","water_feature","wetland"],true,false],["==",["geometry-type"],"Point"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-blur":0.5,"text-color":"hsl(0, 0%, 100%)"}},{"id":"water-line-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12],18,["step",["get","sizerank"],18,9,16]],"text-max-angle":30,"text-letter-spacing":["match",["get","class"],"ocean",0.25,["sea","bay"],0.15,0],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"water-point-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"Point"]],"layout":{"text-line-height":1.3,"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12]],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":["match",["get","class"],"ocean",0.25,["bay","sea"],0.15,0.01],"text-max-width":["match",["get","class"],"ocean",4,"sea",5,["bay","water"],7,10]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"poi-label","type":"symbol","source":"composite","source-layer":"poi_label","minzoom":6,"filter":["<=",["get","filterrank"],["+",["step",["zoom"],0,16,1,17,2],3]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-color":["match",["get","class"],["park_like"],"hsl(95, 75%, 72%)","hsl(0, 0%, 100%)"],"text-halo-blur":0.5,"text-halo-width":["step",["zoom"],["step",["get","sizerank"],1,5,1.5],17,["step",["get","sizerank"],1.25,13,1.5]]}},{"id":"transit-label","type":"symbol","source":"composite","source-layer":"transit_stop_label","minzoom":12,"filter":["step",["zoom"],["all",["match",["get","mode"],["rail","metro_rail"],true,false],["!=",["get","stop_type"],"entrance"]],15,["all",["match",["get","mode"],["rail","metro_rail","ferry","light_rail"],true,false],["!=",["get","stop_type"],"entrance"]],16,["all",["!=",["get","mode"],"bus"],["!=",["get","stop_type"],"entrance"]],17,["!=",["get","stop_type"],"entrance"],19,true],"layout":{"text-size":12,"icon-image":["get","network"],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["match",["get","stop_type"],"entrance","left","center"],"text-offset":["match",["get","stop_type"],"entrance",["literal",[1,0]],["literal",[0,0.8]]],"text-anchor":["match",["get","stop_type"],"entrance","left","top"],"text-field":["step",["zoom"],"",14,["match",["get","mode"],["rail","metro_rail"],["coalesce",["get","name_en"],["get","name"]],""],16,["match",["get","mode"],["bus","bicycle"],"",["coalesce",["get","name_en"],["get","name"]]],18,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.01,"text-max-width":["match",["get","stop_type"],"entrance",15,9]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"airport-label","type":"symbol","source":"composite","source-layer":"airport_label","minzoom":8,"layout":{"text-line-height":1.1,"text-size":["step",["get","sizerank"],18,9,12],"icon-image":["step",["get","sizerank"],["concat",["get","maki"],"-15"],9,["concat",["get","maki"],"-11"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":[0,0.75],"text-rotation-alignment":"viewport","text-anchor":"top","text-field":["step",["get","sizerank"],["coalesce",["get","name_en"],["get","name"]],15,["get","ref"]],"text-letter-spacing":0.01,"text-max-width":9},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"settlement-subdivision-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":10,"maxzoom":15,"filter":["all",["==",["get","class"],"settlement_subdivision"],["<=",["get","filterrank"],4]],"layout":{"text-field":["coalesce",["get","name_en"],["get","name"]],"text-transform":"uppercase","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-letter-spacing":["match",["get","type"],"suburb",0.15,["quarter","neighborhood"],0.1,0.1],"text-max-width":7,"text-padding":3,"text-size":["interpolate",["cubic-bezier",0.5,0,1,1],["zoom"],11,["match",["get","type"],"suburb",11,["quarter","neighborhood"],10.5,10.5],15,["match",["get","type"],"suburb",17,["quarter","neighborhood"],16,16]]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"text-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5}},{"id":"settlement-label","type":"symbol","source":"composite","source-layer":"place_label","maxzoom":15,"filter":["all",["<=",["get","filterrank"],3],["==",["get","class"],"settlement"],["step",["zoom"],true,13,[">=",["get","symbolrank"],11],14,[">=",["get","symbolrank"],13]]],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.9,1],["zoom"],3,["step",["get","symbolrank"],12,9,11,10,10.5,12,9.5,14,8.5,16,6.5,17,4],15,["step",["get","symbolrank"],28,9,26,10,23,11,21,12,20,13,19,15,17]],"icon-image":["case",["==",["get","capital"],2],"border-dot-13",["step",["get","symbolrank"],"dot-11",9,"dot-10",11,"dot-9"]],"text-font":["step",["zoom"],["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]],8,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],11,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],10,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],12,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],11,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],13,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],12,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],15,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],13,["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]]],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],8,"center"],"text-offset":["step",["zoom"],["match",["get","capital"],2,["match",["get","text_anchor"],"bottom",["literal",[0,-0.3]],"bottom-left",["literal",[0.3,-0.1]],"left",["literal",[0.45,0.1]],"top-left",["literal",[0.3,0.1]],"top",["literal",[0,0.3]],"top-right",["literal",[-0.3,0.1]],"right",["literal",[-0.45,0]],"bottom-right",["literal",[-0.3,-0.1]],["literal",[0,-0.3]]],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]]],8,["literal",[0,0]]],"text-anchor":["step",["zoom"],["get","text_anchor"],8,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":7},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"icon-opacity":["step",["zoom"],1,8,0],"text-halo-blur":1}},{"id":"state-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":3,"maxzoom":9,"filter":["==",["get","class"],"state"],"layout":{"text-size":["interpolate",["cubic-bezier",0.85,0.7,0.65,1],["zoom"],4,["step",["get","symbolrank"],10,6,9.5,7,9],9,["step",["get","symbolrank"],24,6,18,7,14]],"text-transform":"uppercase","text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"text-field":["step",["zoom"],["step",["get","symbolrank"],["coalesce",["get","name_en"],["get","name"]],5,["coalesce",["get","abbr"],["get","name_en"],["get","name"]]],5,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.15,"text-max-width":6},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1}},{"id":"country-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":1,"maxzoom":10,"filter":["==",["get","class"],"country"],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.7,1],["zoom"],1,["step",["get","symbolrank"],11,4,9,5,8],9,["step",["get","symbolrank"],28,4,22,5,21]],"icon-image":"dot-11","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],7,"center"],"text-offset":["step",["zoom"],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]],7,["literal",[0,0]]],"text-anchor":["step",["zoom"],["coalesce",["get","text_anchor"],"center"],7,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":6},"paint":{"icon-opacity":["step",["zoom"],["case",["has","text_anchor"],1,0],7,0],"text-color":"hsl(0, 0%, 100%)","text-halo-color":["interpolate",["exponential",1],["zoom"],0,"hsl(224, 2%, 18%)",4,"hsl(224, 1%, 12%)",8,"hsl(224, 1%, 2%)"],"text-halo-width":1.25}}],"visibility":"public","created":"1970-01-01T00:00:00.000Z","modified":"1970-01-01T00:00:00.000Z","owner":"mapbox","id":"satellite-streets-v11","draft":false} +{"version":8,"name":"Mapbox Satellite Streets","metadata":{"mapbox:type":"default","mapbox:origin":"satellite-streets-v11","mapbox:autocomposite":true,"mapbox:groups":{"1444855786460.0557":{"name":"Roads","collapsed":true},"1444934295202.7542":{"name":"Admin boundaries","collapsed":true},"1444855799204.86":{"name":"Bridges","collapsed":true},"1444855769305.6016":{"name":"Tunnels","collapsed":true}},"mapbox:sdk-support":{"js":"0.49.0","android":"6.5.0","ios":"4.4.0"},"mapbox:trackposition":true},"sources":{"mapbox://mapbox.satellite":{"url":"mapbox://mapbox.satellite","type":"raster","tileSize":256},"composite":{"url":"mapbox://mapbox.mapbox-streets-v8","type":"vector"}},"center":[-74.0053,40.7123],"zoom":14,"sprite":"http://carma-cloud:8080/images/sprite","glyphs":"http://carma-cloud:8080/mapbox/{fontstack}/{range}.pbf","layers":[{"id":"background","type":"background","layout":{},"paint":{"background-color":"hsl(222, 56%, 4%)"}},{"id":"satellite","type":"raster","source":"mapbox://mapbox.satellite","layout":{},"paint":{}},{"id":"tunnel-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-dasharray":[3,3],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-major-link-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-path","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-color":"hsl(0, 0%, 86%)","line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-steps","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-major-link","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 78%)","trunk_link","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-pedestrian","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","street","street_limited","tertiary"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"tunnel-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 78%)","trunk","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","motorway_link","trunk","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"ferry","type":"line","source":"composite","source-layer":"road","minzoom":8,"filter":["==",["get","type"],"ferry"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-dasharray":["step",["zoom"],["literal",[1,0]],13,["literal",[12,4]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"ferry-auto","type":"line","source":"composite","source-layer":"road","filter":["==",["get","type"],"ferry_auto"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-low","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,0.75,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],6,0.25,8,0.6,13,1,15,0]}},{"id":"road-major-link-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-path","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"path"],["step",["zoom"],["!",["match",["get","type"],["steps","sidewalk","crossing"],true,false]],16,["!=",["get","type"],"steps"]],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],13,0.5,14,1,15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-steps","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-major-link","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-pedestrian","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-street","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["interpolate",["exponential",1],["zoom"],8,"hsl(0, 0%, 96%)",10,"hsl(0, 0%, 89%)"],"line-opacity":["interpolate",["exponential",1.25],["zoom"],6,0.25,13,1,15,0]}},{"id":"road-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"road-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["step",["zoom"],["match",["get","class"],"motorway","hsl(26, 87%, 62%)","trunk","hsl(46, 80%, 60%)","hsl(46, 80%, 60%)"],9,["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"]],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","oneway"],"true"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"bridge-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["step",["zoom"],0,14,1]}},{"id":"bridge-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-major-link-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-path","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-steps","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["==",["get","structure"],"bridge"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-major-link","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-pedestrian","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","track","service"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"bridge-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"aerialway","type":"line","source":"composite","source-layer":"road","minzoom":13,"filter":["==",["get","class"],"aerialway"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(230, 10%, 74%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1]}},{"id":"admin-1-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"bevel"},"paint":{"line-color":["interpolate",["linear"],["zoom"],8,"hsl(35, 12%, 89%)",16,"hsl(230, 49%, 90%)"],"line-width":["interpolate",["linear"],["zoom"],7,3.75,12,5.5],"line-opacity":["interpolate",["linear"],["zoom"],7,0,8,0.75],"line-dasharray":[1,0],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,8,3]}},{"id":"admin-0-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{},"paint":{"line-width":["interpolate",["linear"],["zoom"],3,3.5,10,8],"line-color":["interpolate",["linear"],["zoom"],6,"hsl(35, 12%, 89%)",8,"hsl(230, 49%, 90%)"],"line-opacity":["interpolate",["linear"],["zoom"],3,0,4,0.5],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,10,2]}},{"id":"admin-1-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-dasharray":["step",["zoom"],["literal",[2,0]],7,["literal",[2,2,6,2]]],"line-width":["interpolate",["linear"],["zoom"],7,0.75,12,1.5],"line-opacity":["interpolate",["linear"],["zoom"],2,0,3,1],"line-color":"hsl(0, 0%, 0%)"}},{"id":"admin-0-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","disputed"],"false"],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"admin-0-boundary-disputed","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","disputed"],"true"],["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round"},"paint":{"line-dasharray":[1.5,1.5],"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"road-label","type":"symbol","source":"composite","source-layer":"road","minzoom":10,"filter":["step",["zoom"],["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],true,false],12,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary","pedestrian","street","street_limited"],true,false],15,["match",["get","class"],["golf","path"],false,true]],"layout":{"text-size":["interpolate",["linear"],["zoom"],10,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],10,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],9,6.5],18,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],16,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],14,13]],"text-max-angle":30,"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line","text-padding":1,"text-rotation-alignment":"map","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":0.01},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"road-number-shield","type":"symbol","source":"composite","source-layer":"road","minzoom":6,"filter":["all",["has","reflen"],["<=",["get","reflen"],6],["step",["zoom"],["==",["geometry-type"],"Point"],11,[">",["get","len"],5000],12,[">",["get","len"],2500],13,[">",["get","len"],1000],14,true]],"layout":{"text-size":9,"icon-image":["concat",["get","shield"],"-",["to-string",["get","reflen"]]],"icon-rotation-alignment":"viewport","text-max-angle":38,"symbol-spacing":["interpolate",["linear"],["zoom"],11,150,14,200],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"symbol-placement":["step",["zoom"],"point",11,"line"],"text-rotation-alignment":"viewport","text-field":["get","ref"],"text-letter-spacing":0.05},"paint":{"text-color":["match",["get","shield_text_color"],"white","hsl(0, 0%, 100%)","black","hsl(0, 0%, 7%)","yellow","hsl(50, 100%, 70%)","orange","hsl(25, 100%, 75%)","blue","hsl(230, 48%, 34%)","hsl(0, 0%, 100%)"]}},{"id":"road-exit-shield","type":"symbol","metadata":{},"source":"composite","source-layer":"motorway_junction","minzoom":14,"filter":["all",["has","reflen"],["<=",["get","reflen"],9]],"layout":{"text-field":["get","ref"],"text-size":9,"icon-image":["concat","motorway-exit-",["to-string",["get","reflen"]]],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"]},"paint":{"text-color":"hsl(0, 0%, 100%)","text-translate":[0,0]}},{"id":"waterway-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":13,"filter":["all",["match",["get","class"],["canal","river","stream"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-max-angle":30,"symbol-spacing":["interpolate",["linear",1],["zoom"],15,250,17,400],"text-size":["interpolate",["linear"],["zoom"],13,12,18,16],"symbol-placement":"line","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"natural-line-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["glacier","landform"],true,false],["==",["geometry-type"],"LineString"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"text-max-angle":30,"text-field":["coalesce",["get","name_en"],["get","name"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport"},"paint":{"text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5,"text-color":["step",["zoom"],["step",["get","sizerank"],"hsl(26, 20%, 42%)",5,"hsl(26, 25%, 32%)"],17,["step",["get","sizerank"],"hsl(26, 20%, 42%)",13,"hsl(26, 25%, 32%)"]]}},{"id":"natural-point-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["dock","glacier","landform","water_feature","wetland"],true,false],["==",["geometry-type"],"Point"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-blur":0.5,"text-color":"hsl(0, 0%, 100%)"}},{"id":"water-line-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12],18,["step",["get","sizerank"],18,9,16]],"text-max-angle":30,"text-letter-spacing":["match",["get","class"],"ocean",0.25,["sea","bay"],0.15,0],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"water-point-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"Point"]],"layout":{"text-line-height":1.3,"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12]],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":["match",["get","class"],"ocean",0.25,["bay","sea"],0.15,0.01],"text-max-width":["match",["get","class"],"ocean",4,"sea",5,["bay","water"],7,10]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"poi-label","type":"symbol","source":"composite","source-layer":"poi_label","minzoom":6,"filter":["<=",["get","filterrank"],["+",["step",["zoom"],0,16,1,17,2],3]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-color":["match",["get","class"],["park_like"],"hsl(95, 75%, 72%)","hsl(0, 0%, 100%)"],"text-halo-blur":0.5,"text-halo-width":["step",["zoom"],["step",["get","sizerank"],1,5,1.5],17,["step",["get","sizerank"],1.25,13,1.5]]}},{"id":"transit-label","type":"symbol","source":"composite","source-layer":"transit_stop_label","minzoom":12,"filter":["step",["zoom"],["all",["match",["get","mode"],["rail","metro_rail"],true,false],["!=",["get","stop_type"],"entrance"]],15,["all",["match",["get","mode"],["rail","metro_rail","ferry","light_rail"],true,false],["!=",["get","stop_type"],"entrance"]],16,["all",["!=",["get","mode"],"bus"],["!=",["get","stop_type"],"entrance"]],17,["!=",["get","stop_type"],"entrance"],19,true],"layout":{"text-size":12,"icon-image":["get","network"],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["match",["get","stop_type"],"entrance","left","center"],"text-offset":["match",["get","stop_type"],"entrance",["literal",[1,0]],["literal",[0,0.8]]],"text-anchor":["match",["get","stop_type"],"entrance","left","top"],"text-field":["step",["zoom"],"",14,["match",["get","mode"],["rail","metro_rail"],["coalesce",["get","name_en"],["get","name"]],""],16,["match",["get","mode"],["bus","bicycle"],"",["coalesce",["get","name_en"],["get","name"]]],18,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.01,"text-max-width":["match",["get","stop_type"],"entrance",15,9]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"airport-label","type":"symbol","source":"composite","source-layer":"airport_label","minzoom":8,"layout":{"text-line-height":1.1,"text-size":["step",["get","sizerank"],18,9,12],"icon-image":["step",["get","sizerank"],["concat",["get","maki"],"-15"],9,["concat",["get","maki"],"-11"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":[0,0.75],"text-rotation-alignment":"viewport","text-anchor":"top","text-field":["step",["get","sizerank"],["coalesce",["get","name_en"],["get","name"]],15,["get","ref"]],"text-letter-spacing":0.01,"text-max-width":9},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"settlement-subdivision-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":10,"maxzoom":15,"filter":["all",["==",["get","class"],"settlement_subdivision"],["<=",["get","filterrank"],4]],"layout":{"text-field":["coalesce",["get","name_en"],["get","name"]],"text-transform":"uppercase","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-letter-spacing":["match",["get","type"],"suburb",0.15,["quarter","neighborhood"],0.1,0.1],"text-max-width":7,"text-padding":3,"text-size":["interpolate",["cubic-bezier",0.5,0,1,1],["zoom"],11,["match",["get","type"],"suburb",11,["quarter","neighborhood"],10.5,10.5],15,["match",["get","type"],"suburb",17,["quarter","neighborhood"],16,16]]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"text-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5}},{"id":"settlement-label","type":"symbol","source":"composite","source-layer":"place_label","maxzoom":15,"filter":["all",["<=",["get","filterrank"],3],["==",["get","class"],"settlement"],["step",["zoom"],true,13,[">=",["get","symbolrank"],11],14,[">=",["get","symbolrank"],13]]],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.9,1],["zoom"],3,["step",["get","symbolrank"],12,9,11,10,10.5,12,9.5,14,8.5,16,6.5,17,4],15,["step",["get","symbolrank"],28,9,26,10,23,11,21,12,20,13,19,15,17]],"icon-image":["case",["==",["get","capital"],2],"border-dot-13",["step",["get","symbolrank"],"dot-11",9,"dot-10",11,"dot-9"]],"text-font":["step",["zoom"],["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]],8,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],11,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],10,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],12,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],11,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],13,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],12,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],15,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],13,["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]]],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],8,"center"],"text-offset":["step",["zoom"],["match",["get","capital"],2,["match",["get","text_anchor"],"bottom",["literal",[0,-0.3]],"bottom-left",["literal",[0.3,-0.1]],"left",["literal",[0.45,0.1]],"top-left",["literal",[0.3,0.1]],"top",["literal",[0,0.3]],"top-right",["literal",[-0.3,0.1]],"right",["literal",[-0.45,0]],"bottom-right",["literal",[-0.3,-0.1]],["literal",[0,-0.3]]],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]]],8,["literal",[0,0]]],"text-anchor":["step",["zoom"],["get","text_anchor"],8,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":7},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"icon-opacity":["step",["zoom"],1,8,0],"text-halo-blur":1}},{"id":"state-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":3,"maxzoom":9,"filter":["==",["get","class"],"state"],"layout":{"text-size":["interpolate",["cubic-bezier",0.85,0.7,0.65,1],["zoom"],4,["step",["get","symbolrank"],10,6,9.5,7,9],9,["step",["get","symbolrank"],24,6,18,7,14]],"text-transform":"uppercase","text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"text-field":["step",["zoom"],["step",["get","symbolrank"],["coalesce",["get","name_en"],["get","name"]],5,["coalesce",["get","abbr"],["get","name_en"],["get","name"]]],5,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.15,"text-max-width":6},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1}},{"id":"country-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":1,"maxzoom":10,"filter":["==",["get","class"],"country"],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.7,1],["zoom"],1,["step",["get","symbolrank"],11,4,9,5,8],9,["step",["get","symbolrank"],28,4,22,5,21]],"icon-image":"dot-11","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],7,"center"],"text-offset":["step",["zoom"],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]],7,["literal",[0,0]]],"text-anchor":["step",["zoom"],["coalesce",["get","text_anchor"],"center"],7,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":6},"paint":{"icon-opacity":["step",["zoom"],["case",["has","text_anchor"],1,0],7,0],"text-color":"hsl(0, 0%, 100%)","text-halo-color":["interpolate",["exponential",1],["zoom"],0,"hsl(224, 2%, 18%)",4,"hsl(224, 1%, 12%)",8,"hsl(224, 1%, 2%)"],"text-halo-width":1.25}}],"visibility":"public","created":"1970-01-01T00:00:00.000Z","modified":"1970-01-01T00:00:00.000Z","owner":"mapbox","id":"satellite-streets-v11","draft":false} diff --git a/web/mapbox/sourcelayers.json b/web/mapbox/sourcelayers.json index 36e7f997..1dd3763d 100644 --- a/web/mapbox/sourcelayers.json +++ b/web/mapbox/sourcelayers.json @@ -1,7 +1,7 @@ { "ctrl": { - "source": {"type": "vector", "tiles": ["https://www.carma-cloud.com/api/ctrl/{z}/{x}/{y}"], "minzoom": 17}, + "source": {"type": "vector", "tiles": ["http://carma-cloud:8080/api/ctrl/{z}/{x}/{y}"], "minzoom": 17}, "layers": [ {"type": "fill", "source-layer": "pavement", "paint":{"fill-color": ["match", ["get", "type"], "d", "#666", "s", "#999", "#666"]}}, diff --git a/web/mapbox/validatexodr_sourcelayers.json b/web/mapbox/validatexodr_sourcelayers.json index 5f8cf03b..d5ef9b17 100644 --- a/web/mapbox/validatexodr_sourcelayers.json +++ b/web/mapbox/validatexodr_sourcelayers.json @@ -1,7 +1,7 @@ { "ctrl": { - "source": {"type": "vector", "tiles": ["https://carma-cloud.com/api/vctrl/{z}/{x}/{y}"], "minzoom": 18}, + "source": {"type": "vector", "tiles": ["http://carma-cloud:8080/api/vctrl/{z}/{x}/{y}"], "minzoom": 18}, "layers": [ {"type": "fill", "source-layer": "pavement", "paint":{"fill-color":"#999", "fill-opacity": 0}}, diff --git a/web/script/rsu.js b/web/script/rsu.js index 878bb480..5bb177be 100644 --- a/web/script/rsu.js +++ b/web/script/rsu.js @@ -42,7 +42,7 @@ async function initMap() { //Init Map oMap = new mapboxgl.Map({ 'container': 'mapid', 'style': 'mapbox/satellite-streets-v11.json', 'attributionControl': false, - 'minZoom': 4, 'maxZoom': 24, 'center': [-81.83067386, 28.1195796], 'zoom': 15, 'accessToken': 'pk.eyJ1IjoiZGR1MjAyMCIsImEiOiJjbDJyeHJob2YwYnhwM2xtaG9zaDdnYTR4In0.Rh2bSS44c99BoDj2W7jjfw' + 'minZoom': 4, 'maxZoom': 24, 'center': [-81.83067386, 28.1195796], 'zoom': 15, 'accessToken': 'pk.eyJ1Ijoia3J1ZWdlcmIiLCJhIjoiY2tuajlwYWZ5MGI0ZTJ1cGV1bTk5emtsaCJ9.En7O3cNsbmy7Gk555ZjmVQ' }); window.mymap = oMap; oMap.dragRotate.disable(); // disable map rotation using right click + drag