From 9aea1fffeef38bccb4f4848cac80af890d9ead19 Mon Sep 17 00:00:00 2001 From: kara Diaby Date: Thu, 16 Apr 2020 17:39:41 +0200 Subject: [PATCH 1/4] Migrate the map editor to mapbox-gl with react component --- .../components/MapEditor/MapEditor.js | 199 ++ .../components/MapEditor/SearchInput.js | 99 + .../components/MapEditor/SwitchMapStyle.js | 40 + .../MapEditor/images/preview-ortho.png | Bin 0 -> 22859 bytes .../MapEditor/images/preview-vector.png | Bin 0 -> 17570 bytes .../components/MapEditor/styles/ortho.json | 2292 +++++++++++++++ .../components/MapEditor/styles/vector.json | 2460 +++++++++++++++++ app/javascript/components/MapEditor/utils.js | 18 + app/javascript/loaders/MapEditor.js | 3 + app/views/champs/carte/show.js.erb | 7 +- .../dossiers/editable_champs/_carte.html.haml | 14 +- config/initializers/assets.rb | 2 + .../initializers/content_security_policy.rb | 2 +- config/initializers/flipper.rb | 1 + db/schema.rb | 4 +- package.json | 3 + yarn.lock | 299 +- 17 files changed, 5424 insertions(+), 19 deletions(-) create mode 100644 app/javascript/components/MapEditor/MapEditor.js create mode 100644 app/javascript/components/MapEditor/SearchInput.js create mode 100644 app/javascript/components/MapEditor/SwitchMapStyle.js create mode 100644 app/javascript/components/MapEditor/images/preview-ortho.png create mode 100644 app/javascript/components/MapEditor/images/preview-vector.png create mode 100644 app/javascript/components/MapEditor/styles/ortho.json create mode 100644 app/javascript/components/MapEditor/styles/vector.json create mode 100644 app/javascript/components/MapEditor/utils.js create mode 100644 app/javascript/loaders/MapEditor.js diff --git a/app/javascript/components/MapEditor/MapEditor.js b/app/javascript/components/MapEditor/MapEditor.js new file mode 100644 index 000000000..6a219fa62 --- /dev/null +++ b/app/javascript/components/MapEditor/MapEditor.js @@ -0,0 +1,199 @@ +import React, { useState, useRef, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import mapboxgl from 'mapbox-gl'; +import ReactMapboxGl, { GeoJSONLayer, ZoomControl } from 'react-mapbox-gl'; +import DrawControl from 'react-mapbox-gl-draw'; +import area from '@turf/area'; +import SwitchMapStyle from './SwitchMapStyle'; +import SearchInput from './SearchInput'; +import { fire } from '@utils'; +import ortho from './styles/ortho.json'; +import vector from './styles/vector.json'; +import { + createFeatureCollection, + polygonCadastresFill, + polygonCadastresLine, + ERROR_GEO_JSON +} from './utils'; +import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'; + +const Map = ReactMapboxGl({}); + +const MapEditor = ({ featureCollection: { features, bbox, id } }) => { + const drawControl = useRef(null); + const [style, setStyle] = useState('ortho'); + const [coords, setCoords] = useState([1.7, 46.9]); + const [zoom, setZoom] = useState([5]); + const [currentMap, setCurrentMap] = useState({}); + let input = document.querySelector( + `input[data-feature-collection-id="${id}"]` + ); + + let userSelections = features.filter( + feature => feature.properties.source === 'selection_utilisateur' + ); + + let cadastresFeatureCollection = { + type: 'FeatureCollection', + features: [] + }; + + const constructCadastresFeatureCollection = features => { + for (let feature of features) { + switch (feature.properties.source) { + case 'cadastre': + cadastresFeatureCollection.features.push(feature); + break; + } + } + }; + constructCadastresFeatureCollection(features); + + const mapStyle = style === 'ortho' ? ortho : vector; + + const saveFeatureCollection = featuresToSave => { + const featuresCollection = createFeatureCollection(featuresToSave); + if (area(featuresCollection) < 300000) { + input.value = JSON.stringify(featuresCollection); + } else { + input.value = ERROR_GEO_JSON; + } + fire(input, 'change'); + }; + + const onDrawCreate = ({ features }) => { + const draw = drawControl.current.draw; + const featureId = features[0].id; + draw.setFeatureProperty(featureId, 'id', featureId); + draw.setFeatureProperty(featureId, 'source', 'selection_utilisateur'); + userSelections.push(draw.get(featureId)); + saveFeatureCollection(userSelections); + }; + + const onDrawUpdate = ({ features }) => { + let featureId = features[0].properties.id; + userSelections = userSelections.map(selection => { + if (selection.properties.id === featureId) { + selection = features[0]; + } + return selection; + }); + saveFeatureCollection(userSelections); + }; + + const onDrawDelete = ({ features }) => { + userSelections = userSelections.filter( + selection => selection.properties.id !== features[0].properties.id + ); + saveFeatureCollection(userSelections); + }; + + const onMapLoad = map => { + setCurrentMap(map); + if (userSelections.length > 0) { + userSelections.map((selection, index) => { + selection.properties.id = index + 1; + drawControl.current.draw.add(selection); + }); + } + }; + + const onMapUpdate = evt => { + if (currentMap) { + cadastresFeatureCollection.features = []; + constructCadastresFeatureCollection( + evt.detail.featureCollection.features + ); + currentMap + .getSource('cadastres-layer') + .setData(cadastresFeatureCollection); + } + }; + + useEffect(() => { + addEventListener('map:update', onMapUpdate); + return () => removeEventListener('map:update', onMapUpdate); + }); + + if (!mapboxgl.supported()) { + return ( +

+ Nous ne pouvons pas afficher notre éditeur de carte car il est + imcompatible avec votre navigateur. Nous vous conseillons de le mettre à + jour ou utiliser les dernières versions de Chrome, Firefox ou Safari +

+ ); + } + + return ( + <> +
+ { + setCoords(searchTerm); + setZoom([17]); + }} + /> +
+ onMapLoad(map)} + fitBounds={bbox} + fitBoundsOptions={{ padding: 100 }} + center={coords} + zoom={zoom} + style={mapStyle} + containerStyle={{ + height: '500px' + }} + > + + +
+ style === 'ortho' ? setStyle('vector') : setStyle('ortho') + } + > + +
+ +
+ + ); +}; + +MapEditor.propTypes = { + featureCollection: PropTypes.shape({ + bbox: PropTypes.array, + features: PropTypes.array, + id: PropTypes.number + }) +}; + +export default MapEditor; diff --git a/app/javascript/components/MapEditor/SearchInput.js b/app/javascript/components/MapEditor/SearchInput.js new file mode 100644 index 000000000..65d050103 --- /dev/null +++ b/app/javascript/components/MapEditor/SearchInput.js @@ -0,0 +1,99 @@ +import React, { useState, useEffect } from 'react'; +import { getJSON } from '@utils'; +import { + Combobox, + ComboboxInput, + ComboboxPopover, + ComboboxList, + ComboboxOption +} from '@reach/combobox'; +import '@reach/combobox/styles.css'; +import PropTypes from 'prop-types'; + +let cache = {}; +const useAddressSearch = searchTerm => { + const [addresses, setAddresses] = useState([]); + useEffect(() => { + if (searchTerm.trim() !== '') { + let isFresh = true; + fetchAddresses(searchTerm).then(addresses => { + if (isFresh) setAddresses(addresses); + }); + return () => (isFresh = false); + } + }, [searchTerm]); + return addresses; +}; + +const fetchAddresses = value => { + if (cache[value]) { + return Promise.resolve(cache[value]); + } + const url = `https://api-adresse.data.gouv.fr/search/`; + return getJSON(url, { q: value, limit: 5 }, 'get').then(result => { + if (result) { + cache[value] = result; + } + return result; + }); +}; + +const SearchInput = ({ getCoords }) => { + const [searchTerm, setSearchTerm] = useState(''); + const addresses = useAddressSearch(searchTerm); + const handleSearchTermChange = event => { + setSearchTerm(event.target.value); + }; + return ( + + + {addresses.features && ( + + {addresses.features.length > 0 ? ( + + {addresses.features.map(feature => { + const str = `${feature.properties.name}, ${feature.properties.city}`; + return ( + getCoords(feature.geometry.coordinates)} + key={str} + value={str} + /> + ); + })} + + ) : ( + Aucun résultat + )} + + )} + + ); +}; + +SearchInput.propTypes = { + getCoords: PropTypes.func +}; + +export default SearchInput; diff --git a/app/javascript/components/MapEditor/SwitchMapStyle.js b/app/javascript/components/MapEditor/SwitchMapStyle.js new file mode 100644 index 000000000..4a9cf3eff --- /dev/null +++ b/app/javascript/components/MapEditor/SwitchMapStyle.js @@ -0,0 +1,40 @@ +import React from 'react'; +import ortho from './images/preview-ortho.png'; +import vector from './images/preview-vector.png'; +import PropTypes from 'prop-types'; + +const SwitchMapStyle = ({ isVector }) => { + const style = isVector ? 'Satellite' : 'Vectoriel'; + const source = `${isVector ? ortho : vector}`; + + const imgStyle = { + width: '100%', + height: '100%' + }; + + const textStyle = { + position: 'relative', + bottom: '26px', + left: '4px', + color: `${isVector ? '#fff' : '#000'}` + }; + return ( +
+ {style} +
+ {style} +
+ +
+ ); +}; + +SwitchMapStyle.propTypes = { + isVector: PropTypes.bool +}; + +export default SwitchMapStyle; diff --git a/app/javascript/components/MapEditor/images/preview-ortho.png b/app/javascript/components/MapEditor/images/preview-ortho.png new file mode 100644 index 0000000000000000000000000000000000000000..46db7e467b0066b5c5954e325ccf76c7e421f9ca GIT binary patch literal 22859 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 KMNUMnLSTXbHgTB% literal 0 HcmV?d00001 diff --git a/app/javascript/components/MapEditor/styles/ortho.json b/app/javascript/components/MapEditor/styles/ortho.json new file mode 100644 index 000000000..296c3c8dc --- /dev/null +++ b/app/javascript/components/MapEditor/styles/ortho.json @@ -0,0 +1,2292 @@ +{ + "version": 8, + "name": "Cadastre sur photographies aériennes", + "metadata": { + "mapbox:autocomposite": false, + "mapbox:groups": { + "1444849242106.713": {"collapsed": false, "name": "Places"}, + "1444849334699.1902": {"collapsed": true, "name": "Bridges"}, + "1444849345966.4436": {"collapsed": false, "name": "Roads"}, + "1444849354174.1904": {"collapsed": true, "name": "Tunnels"}, + "1444849364238.8171": {"collapsed": false, "name": "Buildings"}, + "1444849382550.77": {"collapsed": false, "name": "Water"}, + "1444849388993.3071": {"collapsed": false, "name": "Land"} + }, + "mapbox:type": "template", + "openmaptiles:mapbox:owner": "openmaptiles", + "openmaptiles:mapbox:source:url": "mapbox://openmaptiles.4qljc88t", + "openmaptiles:version": "3.x", + "maputnik:renderer": "mbgljs" + }, + "center": [0, 0], + "zoom": 1, + "bearing": 0, + "pitch": 0, + "sources": { + "cadastre": { + "type": "vector", + "url": "https://openmaptiles.geo.data.gouv.fr/data/cadastre.json" + }, + "decoupage-administratif": { + "type": "vector", + "url": "https://openmaptiles.geo.data.gouv.fr/data/decoupage-administratif.json" + }, + "openmaptiles": { + "type": "vector", + "url": "https://openmaptiles.geo.data.gouv.fr/data/france-vector.json" + }, + "photographies-aeriennes": { + "type": "raster", + "tiles": [ + "https://tiles.geo.api.gouv.fr/photographies-aeriennes/tiles/{z}/{x}/{y}" + ], + "tileSize": 256, + "attribution": "Images aériennes © IGN", + "minzoom": 0, + "maxzoom": 19 + } + }, + "sprite": "https://openmaptiles.github.io/osm-bright-gl-style/sprite", + "glyphs": "https://openmaptiles.geo.data.gouv.fr/fonts/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "photographies-aeriennes", + "type": "raster", + "source": "photographies-aeriennes", + "paint": {"raster-resampling": "linear"} + }, + { + "id": "batiments-line", + "type": "line", + "source": "cadastre", + "source-layer": "batiments", + "minzoom": 16, + "maxzoom": 22, + "layout": {"visibility": "visible"}, + "paint": { + "line-opacity": 1, + "line-color": "rgba(0, 0, 0, 1)", + "line-width": 1 + } + }, + { + "id": "batiments-fill", + "type": "fill", + "source": "cadastre", + "source-layer": "batiments", + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "rgba(150, 150, 150, 1)", + "fill-opacity": {"stops": [[16, 0], [17, 0.6]]}, + "fill-antialias": true + } + }, + { + "id": "parcelles", + "type": "line", + "source": "cadastre", + "source-layer": "parcelles", + "minzoom": 15.5, + "maxzoom": 24, + "layout": { + "visibility": "visible", + "line-cap": "butt", + "line-join": "miter", + "line-miter-limit": 2 + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": 0.8, + "line-width": {"stops": [[16, 1.5], [17, 2]]}, + "line-offset": 0, + "line-blur": 0, + "line-translate": [0, 1], + "line-dasharray": [1], + "line-gap-width": 0 + } + }, + { + "id": "parcelles-fill", + "type": "fill", + "source": "cadastre", + "source-layer": "parcelles", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "rgba(129, 123, 0, 1)", + "fill-opacity": [ + "case", + [ + "boolean", + [ + "feature-state", + "hover" + ], + false + ], + 0.7, + 0.1 + ] + } + }, + { + "id": "parcelle-highlighted", + "type": "fill", + "source": "cadastre", + "source-layer": "parcelles", + "filter": ["==", "id", ""], + "paint": { + "fill-color": "rgba(1, 129, 0, 1)", + "fill-opacity": 0.7 + } + }, + { + "id": "sections", + "type": "line", + "source": "cadastre", + "source-layer": "sections", + "minzoom": 12, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "rgba(0, 0, 0, 1)", + "line-opacity": 0.7, + "line-width": 2, + "line-dasharray": [3, 3], + "line-translate": [0, 0] + } + }, + { + "id": "communes", + "type": "line", + "source": "decoupage-administratif", + "source-layer": "communes", + "minzoom": 10, + "maxzoom": 24, + "filter": ["all"], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "rgba(0, 0, 0, 1)", + "line-width": 1.5, + "line-opacity": 1, + "line-blur": 0 + } + }, + { + "id": "departements", + "type": "line", + "source": "decoupage-administratif", + "source-layer": "departements", + "minzoom": 0, + "maxzoom": 24, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "rgba(0, 0, 0, 1)", + "line-width": 1, + "line-opacity": 1 + } + }, + { + "id": "regions", + "type": "line", + "source": "decoupage-administratif", + "source-layer": "regions", + "minzoom": 0, + "maxzoom": 24, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "rgba(0, 0, 0, 1)", + "line-width": 1, + "line-opacity": 1 + } + }, + { + "id": "waterway_tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 14, + "filter": [ + "all", + ["in", "class", "river", "stream", "canal"], + ["==", "brunnel", "tunnel"] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-dasharray": [2, 4], + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 6]]} + } + }, + { + "id": "waterway-other", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["!in", "class", "canal", "river", "stream"], + ["==", "intermittent", 0] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 2]]} + } + }, + { + "id": "waterway-other-intermittent", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["!in", "class", "canal", "river", "stream"], + ["==", "intermittent", 1] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 2]]}, + "line-dasharray": [4, 3] + } + }, + { + "id": "waterway-stream-canal", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["in", "class", "canal", "stream"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 0] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 6]]} + } + }, + { + "id": "waterway-stream-canal-intermittent", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["in", "class", "canal", "stream"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 1] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 6]]}, + "line-dasharray": [4, 3] + } + }, + { + "id": "waterway-river", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 0] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.2, "stops": [[10, 0.8], [20, 6]]} + } + }, + { + "id": "waterway-river-intermittent", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 1] + ], + "layout": {"line-cap": "round", "visibility": "none"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.2, "stops": [[10, 0.8], [20, 6]]}, + "line-dasharray": [3, 2.5] + } + }, + { + "id": "tunnel-service-track-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service", "track"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#cfcdca", + "line-dasharray": [0.5, 0.25], + "line-width": {"base": 1.2, "stops": [[15, 1], [16, 4], [20, 11]]} + } + }, + { + "id": "tunnel-minor-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["==", "class", "minor"]], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#cfcdca", + "line-opacity": {"stops": [[12, 0], [12.5, 1]]}, + "line-width": { + "base": 1.2, + "stops": [[12, 0.5], [13, 1], [14, 4], [20, 15]] + } + } + }, + { + "id": "tunnel-secondary-tertiary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[8, 1.5], [20, 17]]} + } + }, + { + "id": "tunnel-trunk-primary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "tunnel-motorway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#e9ac77", + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "brunnel", "tunnel"], ["==", "class", "path"]] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [1.5, 0.75], + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 4]]} + } + }, + { + "id": "tunnel-service-track", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service", "track"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff", + "line-width": {"base": 1.2, "stops": [[15.5, 0], [16, 2], [20, 7.5]]} + } + }, + { + "id": "tunnel-minor", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["==", "class", "minor_road"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[13.5, 0], [14, 2.5], [20, 11.5]]} + } + }, + { + "id": "tunnel-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff4c6", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 10]]} + } + }, + { + "id": "tunnel-trunk-primary", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff4c6", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "tunnel-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#ffdaa6", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "tunnel-railway", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["==", "class", "rail"]], + "paint": { + "line-color": "#bbb", + "line-dasharray": [2, 2], + "line-width": {"base": 1.4, "stops": [[14, 0.4], [15, 0.75], [20, 2]]} + } + }, + { + "id": "ferry", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["in", "class", "ferry"]], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "rgba(108, 159, 182, 1)", + "line-dasharray": [2, 2], + "line-width": 1.1 + } + }, + { + "id": "aeroway-taxiway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 12, + "filter": ["all", ["in", "class", "taxiway"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[11, 2], [17, 12]]} + } + }, + { + "id": "aeroway-runway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 12, + "filter": ["all", ["in", "class", "runway"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-opacity": 0.2, + "line-width": {"base": 1.5, "stops": [[11, 5], [17, 55]]} + } + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + ["in", "class", "taxiway"], + ["==", "$type", "LineString"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": {"base": 1, "stops": [[11, 0], [12, 1]]}, + "line-width": {"base": 1.5, "stops": [[11, 1], [17, 10]]} + } + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + ["in", "class", "runway"], + ["==", "$type", "LineString"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": {"base": 1, "stops": [[11, 0], [12, 0.2]]}, + "line-width": {"base": 1.5, "stops": [[11, 4], [17, 50]]} + } + }, + { + "id": "road_area_pier", + "type": "fill", + "metadata": {}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "Polygon"], ["==", "class", "pier"]], + "layout": {"visibility": "visible"}, + "paint": {"fill-antialias": true, "fill-color": "#f8f4f0"} + }, + { + "id": "road_pier", + "type": "line", + "metadata": {}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "LineString"], ["in", "class", "pier"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#f8f4f0", + "line-width": {"base": 1.2, "stops": [[15, 1], [17, 4]]} + } + }, + { + "id": "highway-area", + "type": "fill", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "Polygon"], ["!in", "class", "pier"]], + "layout": {"visibility": "visible"}, + "paint": { + "fill-antialias": false, + "fill-color": "hsla(0, 0%, 89%, 0.56)", + "fill-opacity": {"stops": [[15, 0], [16, 0.9]]}, + "fill-outline-color": "#cfcdca" + } + }, + { + "id": "highway-motorway-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "highway-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "highway-minor-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!=", "brunnel", "tunnel"], + ["in", "class", "minor", "service", "track"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#cfcdca", + "line-opacity": {"stops": [[14, 0], [15, 0.5]]}, + "line-width": {"base": 1.2, "stops": [[15, 0.5], [16, 5]]} + } + }, + { + "id": "highway-secondary-tertiary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[15, 0], [16, 0.3]]}, + "line-width": {"base": 1.2, "stops": [[8, 1.5], [20, 17]]} + } + }, + { + "id": "highway-primary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "primary"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[16, 0], [17, 0.3]]}, + "line-width": { + "base": 1.2, + "stops": [[7, 0], [8, 0.6], [9, 1.5], [20, 22]] + } + } + }, + { + "id": "highway-trunk-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "trunk"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[16, 0], [17, 0.3]]}, + "line-width": { + "base": 1.2, + "stops": [[5, 0], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "highway-motorway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 4, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[8, 0], [9, 0.2]]}, + "line-width": { + "base": 1.2, + "stops": [[4, 0], [5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "highway-path", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["!in", "brunnel", "bridge", "tunnel"], ["==", "class", "path"]] + ], + "layout": {"visibility": "none"}, + "paint": { + "line-color": "#cba", + "line-dasharray": [1.5, 0.75], + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 4]]} + } + }, + { + "id": "highway-motorway-link", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "highway-link", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "highway-minor", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!=", "brunnel", "tunnel"], + ["in", "class", "minor", "service", "track"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#fff", + "line-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "line-width": {"base": 1.2, "stops": [[16, 0], [17, 2.5]]} + } + }, + { + "id": "highway-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [8, 0.5], [20, 13]]}, + "line-opacity": {"stops": [[11, 0], [13, 0.3]]} + } + }, + { + "id": "highway-primary", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "primary"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[8.5, 0], [9, 0.5], [20, 18]]}, + "line-opacity": {"stops": [[8, 0], [9, 0.3]]} + } + }, + { + "id": "highway-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "trunk"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]}, + "line-opacity": {"stops": [[16, 0], [17, 0.3]]} + } + }, + { + "id": "highway-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fc8", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]}, + "line-opacity": {"stops": [[8, 0], [9, 0.2]]} + } + }, + { + "id": "railway-transit", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "transit"], ["!in", "brunnel", "tunnel"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [20, 1]]} + } + }, + { + "id": "railway-transit-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "transit"], ["!in", "brunnel", "tunnel"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 2], [20, 6]]} + } + }, + { + "id": "railway-service", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "rail"], ["has", "service"]] + ], + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [20, 1]]} + } + }, + { + "id": "railway-service-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "rail"], ["has", "service"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 2], [20, 6]]} + } + }, + { + "id": "railway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!has", "service"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "rail"] + ] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "#bbb", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [15, 0.75], [20, 2]]}, + "line-opacity": {"stops": [[11, 0], [13, 1]]} + } + }, + { + "id": "railway-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!has", "service"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "rail"] + ] + ], + "paint": { + "line-color": "#bbb", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 3], [20, 8]]} + } + }, + { + "id": "bridge-motorway-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "bridge-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "bridge-secondary-tertiary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 0.3, + "line-width": {"base": 1.2, "stops": [[8, 1.5], [20, 28]]} + } + }, + { + "id": "bridge-trunk-primary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "hsl(28, 76%, 67%)", + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 26]] + }, + "line-opacity": 0.3 + } + }, + { + "id": "bridge-motorway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + }, + "line-opacity": {"stops": [[16, 0], [17, 0.3]]} + } + }, + { + "id": "bridge-path-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "brunnel", "bridge"], ["==", "class", "path"]] + ], + "paint": { + "line-color": "#f8f4f0", + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 18]]} + } + }, + { + "id": "bridge-path", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "brunnel", "bridge"], ["==", "class", "path"]] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [1.5, 0.75], + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 4]]} + } + }, + { + "id": "bridge-motorway-link", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "bridge-link", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 20]]}, + "line-opacity": {"stops": [[16, 0], [17, 0.3]]} + } + }, + { + "id": "bridge-trunk-primary", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]}, + "line-opacity": 0.3 + } + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fc8", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]}, + "line-opacity": 0.3 + } + }, + { + "id": "bridge-railway", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "bridge"], ["==", "class", "rail"]], + "paint": { + "line-color": "#bbb", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [15, 0.75], [20, 2]]} + } + }, + { + "id": "bridge-railway-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "bridge"], ["==", "class", "rail"]], + "paint": { + "line-color": "#bbb", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 3], [20, 8]]} + } + }, + { + "id": "cablecar", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": ["==", "class", "cable_car"], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-width": {"base": 1, "stops": [[11, 1], [19, 2.5]]} + } + }, + { + "id": "cablecar-dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": ["==", "class", "cable_car"], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-dasharray": [2, 3], + "line-width": {"base": 1, "stops": [[11, 3], [19, 5.5]]} + } + }, + { + "id": "boundary-land-level-4", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [">=", "admin_level", 4], + ["<=", "admin_level", 8], + ["!=", "maritime", 1] + ], + "layout": {"line-join": "round", "visibility": "none"}, + "paint": { + "line-color": "#9e9cab", + "line-dasharray": [3, 1, 1, 1], + "line-width": {"base": 1.4, "stops": [[4, 0.4], [5, 1], [12, 3]]} + } + }, + { + "id": "boundary-land-level-2", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + ["==", "admin_level", 2], + ["!=", "maritime", 1], + ["!=", "disputed", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "none" + }, + "paint": { + "line-color": "hsl(248, 7%, 66%)", + "line-width": { + "base": 1, + "stops": [[0, 0.6], [4, 1.4], [5, 2], [12, 8]] + } + } + }, + { + "id": "boundary-land-disputed", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": ["all", ["!=", "maritime", 1], ["==", "disputed", 1]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "none" + }, + "paint": { + "line-color": "hsl(248, 7%, 70%)", + "line-dasharray": [1, 3], + "line-width": { + "base": 1, + "stops": [[0, 0.6], [4, 1.4], [5, 2], [12, 8]] + } + } + }, + { + "id": "boundary-water", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": ["all", ["in", "admin_level", 2, 4], ["==", "maritime", 1]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(154, 189, 214, 1)", + "line-opacity": {"stops": [[6, 0.6], [10, 1]]}, + "line-width": { + "base": 1, + "stops": [[0, 0.6], [4, 1.4], [5, 2], [12, 8]] + } + } + }, + { + "id": "water-name-lakeline", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": ["==", "$type", "LineString"], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": 14 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 1.5 + } + }, + { + "id": "water-name-ocean", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": ["all", ["==", "$type", "Point"], ["==", "class", "ocean"]], + "layout": { + "symbol-placement": "point", + "symbol-spacing": 350, + "text-field": "{name:latin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": 14 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 1.5 + } + }, + { + "id": "water-name-other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": ["all", ["==", "$type", "Point"], ["!in", "class", "ocean"]], + "layout": { + "symbol-placement": "point", + "symbol-spacing": 350, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": {"stops": [[0, 10], [6, 14]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(0, 51, 178, 1)", + "text-halo-color": "rgba(255, 255, 255, 1)", + "text-halo-width": 1.5 + } + }, + { + "id": "road_oneway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", 1], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "icon-image": "oneway", + "icon-padding": 2, + "icon-rotate": 90, + "icon-rotation-alignment": "map", + "icon-size": {"stops": [[15, 0.5], [19, 1]]}, + "symbol-placement": "line", + "symbol-spacing": 75, + "visibility": "visible" + }, + "paint": {"icon-opacity": 0.5} + }, + { + "id": "road_oneway_opposite", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", -1], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "icon-image": "oneway", + "icon-padding": 2, + "icon-rotate": -90, + "icon-rotation-alignment": "map", + "icon-size": {"stops": [[15, 0.5], [19, 1]]}, + "symbol-placement": "line", + "symbol-spacing": 75, + "visibility": "visible" + }, + "paint": {"icon-opacity": 0.5} + }, + { + "id": "highway-name-path", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15.5, + "filter": ["==", "class", "path"], + "layout": { + "symbol-placement": "line", + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "map", + "text-size": {"base": 1, "stops": [[13, 12], [14, 13]]} + }, + "paint": { + "text-color": "rgba(171, 86, 0, 1)", + "text-halo-color": "#f8f4f0", + "text-halo-width": 2 + } + }, + { + "id": "highway-name-minor", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["in", "class", "minor", "service", "track"] + ], + "layout": { + "symbol-placement": "line", + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "map", + "text-size": {"base": 1, "stops": [[13, 12], [14, 13]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(143, 69, 0, 1)", + "text-halo-blur": 0.5, + "text-halo-width": 2, + "text-halo-color": "rgba(255, 255, 255, 1)" + } + }, + { + "id": "highway-name-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 12.2, + "filter": ["in", "class", "primary", "secondary", "tertiary", "trunk"], + "layout": { + "symbol-placement": "line", + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "map", + "text-size": {"base": 1, "stops": [[13, 12], [14, 13]]}, + "visibility": "visible", + "symbol-z-order": "source" + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-blur": 0.5, + "text-halo-width": 1, + "text-halo-color": "rgba(255, 255, 255, 1)" + } + }, + { + "id": "highway-shield-us-interstate", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 7, + "filter": [ + "all", + ["<=", "ref_length", 6], + ["==", "$type", "LineString"], + ["in", "network", "us-interstate"] + ], + "layout": { + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": { + "base": 1, + "stops": [[7, "point"], [7, "line"], [8, "line"]] + }, + "symbol-spacing": 200, + "text-field": "{ref}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": {"text-color": "rgba(0, 0, 0, 1)"} + }, + { + "id": "highway-shield-us-other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 9, + "filter": [ + "all", + ["<=", "ref_length", 6], + ["==", "$type", "LineString"], + ["in", "network", "us-highway", "us-state"] + ], + "layout": { + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": {"base": 1, "stops": [[10, "point"], [11, "line"]]}, + "symbol-spacing": 200, + "text-field": "{ref}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": {"text-color": "rgba(0, 0, 0, 1)"} + }, + { + "id": "highway-shield", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 8, + "filter": [ + "all", + ["<=", "ref_length", 6], + ["==", "$type", "LineString"], + ["!in", "network", "us-interstate", "us-highway", "us-state"] + ], + "layout": { + "icon-image": "road_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": {"base": 1, "stops": [[10, "point"], [11, "line"]]}, + "symbol-spacing": 200, + "text-field": "{ref}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "viewport", + "text-size": 10, + "visibility": "visible" + }, + "paint": { + "icon-opacity": {"stops": [[8, 0], [9, 1]]}, + "text-opacity": {"stops": [[8, 0], [9, 1]]} + } + }, + { + "id": "waterway-name", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 13, + "filter": ["all", ["==", "$type", "LineString"], ["has", "name"]], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": 14, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(2, 72, 255, 1)", + "text-halo-color": "rgba(255,255,255,1)", + "text-halo-width": 1.5, + "text-halo-blur": 0 + } + }, + { + "id": "airport-label-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "aerodrome_label", + "minzoom": 10, + "filter": ["all", ["has", "iata"]], + "layout": { + "icon-image": "airport_11", + "icon-size": 1, + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-optional": true, + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + } + }, + { + "id": "poi-level-3", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 16, + "filter": [ + "all", + ["==", "$type", "Point"], + [">=", "rank", 25], + ["any", ["!has", "level"], ["==", "level", 0]] + ], + "layout": { + "icon-image": "{class}_11", + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-padding": 20, + "text-size": 12, + "visibility": "visible", + "symbol-spacing": 250, + "symbol-avoid-edges": false, + "text-letter-spacing": 0, + "icon-padding": 2, + "symbol-placement": "point", + "symbol-z-order": "auto", + "text-line-height": 1.2, + "text-allow-overlap": false, + "text-ignore-placement": false, + "icon-allow-overlap": false, + "icon-ignore-placement": false, + "icon-optional": false + }, + "paint": { + "text-color": "rgba(2, 2, 3, 1)", + "text-halo-blur": 0.5, + "text-halo-color": "rgba(232, 227, 227, 1)", + "text-halo-width": 2, + "text-translate-anchor": "map", + "text-opacity": 1 + } + }, + { + "id": "poi-level-2", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "Point"], + ["<=", "rank", 24], + [">=", "rank", 15], + ["any", ["!has", "level"], ["==", "level", 0]] + ], + "layout": { + "icon-image": "{class}_11", + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(2, 2, 3, 1)", + "text-halo-blur": 0.5, + "text-halo-color": "rgba(232, 227, 227, 1)", + "text-halo-width": 1 + } + }, + { + "id": "poi-level-1", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + ["==", "$type", "Point"], + ["<=", "rank", 14], + ["has", "name"], + ["any", ["!has", "level"], ["==", "level", 0]] + ], + "layout": { + "icon-image": "{class}_11", + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(2, 2, 3, 1)", + "text-halo-blur": 0.5, + "text-halo-color": "rgba(232, 227, 227, 1)", + "text-halo-width": 2 + } + }, + { + "id": "poi-railway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "Point"], + ["has", "name"], + ["==", "class", "railway"], + ["==", "subclass", "station"] + ], + "layout": { + "icon-allow-overlap": false, + "icon-ignore-placement": false, + "icon-image": "{class}_11", + "icon-optional": false, + "text-allow-overlap": false, + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-ignore-placement": false, + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-optional": true, + "text-padding": 2, + "text-size": 12 + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-blur": 0.5, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1 + } + }, + { + "id": "place-village", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["==", "class", "village"], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-size": {"base": 1.2, "stops": [[10, 12], [15, 22]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-town", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["==", "class", "town"], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-size": {"base": 1.2, "stops": [[10, 14], [15, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-city", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["all", ["!=", "capital", 2], ["==", "class", "city"]], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-size": {"base": 1.2, "stops": [[7, 14], [11, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-city-capital", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["all", ["==", "capital", 2], ["==", "class", "city"]], + "layout": { + "icon-image": "star_11", + "icon-size": 0.8, + "text-anchor": "left", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-offset": [0.4, 0], + "text-size": {"base": 1.2, "stops": [[7, 14], [11, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-country-other", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + [">=", "rank", 3], + ["!has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Italic"], + "text-max-width": 6.25, + "text-size": {"stops": [[3, 11], [7, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-country-3", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + [">=", "rank", 3], + ["has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": {"stops": [[3, 11], [7, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-country-2", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + ["==", "rank", 2], + ["has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": {"stops": [[2, 11], [5, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-country-1", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + ["==", "rank", 1], + ["has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": {"stops": [[1, 11], [4, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-continent", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 1, + "filter": ["==", "class", "continent"], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": 14, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "sections-symbol", + "type": "symbol", + "source": "cadastre", + "source-layer": "sections", + "minzoom": 13, + "maxzoom": 16, + "layout": { + "visibility": "visible", + "text-field": "{code}", + "text-font": ["Lato Bold"], + "text-optional": false, + "text-size": 14 + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-color": "rgba(200, 214, 248, 1)", + "text-halo-width": 1, + "text-halo-blur": 0, + "text-translate-anchor": "map", + "icon-halo-color": "rgba(255, 255, 255, 1)", + "icon-halo-width": 5, + "text-opacity": 1 + } + }, + { + "id": "parcelles-labels", + "type": "symbol", + "source": "cadastre", + "source-layer": "parcelles", + "minzoom": 16, + "layout": { + "visibility": "visible", + "text-field": "{numero}", + "text-font": ["Lato Bold"], + "text-size": 12, + "text-optional": false, + "text-allow-overlap": false, + "text-ignore-placement": false, + "text-keep-upright": true, + "symbol-z-order": "auto", + "symbol-avoid-edges": false, + "icon-allow-overlap": false + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)", + "text-halo-color": "#fff6f1", + "text-halo-width": 1, + "text-halo-blur": 0, + "icon-opacity": 1, + "text-opacity": 1, + "icon-halo-color": "rgba(255, 255, 255, 1)", + "icon-color": "rgba(0, 0, 0, 1)", + "icon-halo-width": 0 + } + } + ], + "id": "etalab-cadastre-aerial" +} diff --git a/app/javascript/components/MapEditor/styles/vector.json b/app/javascript/components/MapEditor/styles/vector.json new file mode 100644 index 000000000..05bab6a1d --- /dev/null +++ b/app/javascript/components/MapEditor/styles/vector.json @@ -0,0 +1,2460 @@ +{ + "version": 8, + "name": "Bright", + "metadata": { + "mapbox:autocomposite": false, + "mapbox:groups": { + "1444849242106.713": {"collapsed": false, "name": "Places"}, + "1444849334699.1902": {"collapsed": true, "name": "Bridges"}, + "1444849345966.4436": {"collapsed": false, "name": "Roads"}, + "1444849354174.1904": {"collapsed": true, "name": "Tunnels"}, + "1444849364238.8171": {"collapsed": false, "name": "Buildings"}, + "1444849382550.77": {"collapsed": false, "name": "Water"}, + "1444849388993.3071": {"collapsed": false, "name": "Land"} + }, + "mapbox:type": "template", + "openmaptiles:mapbox:owner": "openmaptiles", + "openmaptiles:mapbox:source:url": "mapbox://openmaptiles.4qljc88t", + "openmaptiles:version": "3.x", + "maputnik:renderer": "mbgljs" + }, + "center": [0, 0], + "zoom": 1, + "bearing": 0, + "pitch": 0, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://openmaptiles.geo.data.gouv.fr/data/france-vector.json" + }, + "cadastre": { + "type": "vector", + "url": "https://openmaptiles.geo.data.gouv.fr/data/cadastre.json" + }, + "decoupage-administratif": { + "type": "vector", + "url": "https://openmaptiles.geo.data.gouv.fr/data/decoupage-administratif.json" + } + }, + "sprite": "https://openmaptiles.github.io/osm-bright-gl-style/sprite", + "glyphs": "https://openmaptiles.geo.data.gouv.fr/fonts/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "minzoom": 0, + "maxzoom": 24, + "layout": {"visibility": "visible"}, + "paint": {"background-color": "rgba(255, 246, 241, 1)"} + }, + { + "id": "landcover-glacier", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": ["==", "subclass", "glacier"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "#fff", + "fill-opacity": {"base": 1, "stops": [[0, 0.9], [10, 0.3]]} + } + }, + { + "id": "batiments-fill", + "type": "fill", + "source": "cadastre", + "source-layer": "batiments", + "minzoom": 16, + "paint": {"fill-opacity": 0.3} + }, + { + "id": "batiments-line", + "type": "line", + "source": "cadastre", + "source-layer": "batiments", + "minzoom": 16, + "maxzoom": 22, + "layout": {"visibility": "visible"}, + "paint": {"line-opacity": 1, "line-color": "rgba(0, 0, 0, 1)"} + }, + { + "id": "landuse-residential", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "all", + ["in", "class", "residential", "suburb", "neighbourhood"] + ], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [12, "hsla(30, 19%, 90%, 0.4)"], + [16, "hsla(30, 19%, 90%, 0.2)"] + ] + } + } + }, + { + "id": "landuse-commercial", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["==", "class", "commercial"] + ], + "layout": {"visibility": "visible"}, + "paint": {"fill-color": "hsla(0, 60%, 87%, 0.23)"} + }, + { + "id": "landuse-industrial", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["==", "class", "industrial"] + ], + "paint": {"fill-color": "hsla(49, 100%, 88%, 0.34)"} + }, + { + "id": "landuse-cemetery", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": ["==", "class", "cemetery"], + "paint": {"fill-color": "#e0e4dd"} + }, + { + "id": "landuse-hospital", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": ["==", "class", "hospital"], + "paint": {"fill-color": "#fde"} + }, + { + "id": "landuse-school", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": ["==", "class", "school"], + "paint": {"fill-color": "#f0e8f8"} + }, + { + "id": "landuse-railway", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": ["==", "class", "railway"], + "paint": {"fill-color": "hsla(30, 19%, 90%, 0.4)"} + }, + { + "id": "landcover-wood", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": ["==", "class", "wood"], + "paint": { + "fill-antialias": {"base": 1, "stops": [[0, false], [9, true]]}, + "fill-color": "#6a4", + "fill-opacity": 0.1, + "fill-outline-color": "hsla(0, 0%, 0%, 0.03)" + } + }, + { + "id": "landcover-grass", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": ["==", "class", "grass"], + "paint": {"fill-color": "#d8e8c8", "fill-opacity": 1} + }, + { + "id": "landcover-grass-park", + "type": "fill", + "metadata": {"mapbox:group": "1444849388993.3071"}, + "source": "openmaptiles", + "source-layer": "park", + "filter": ["==", "class", "public_park"], + "paint": {"fill-color": "#d8e8c8", "fill-opacity": 0.8} + }, + { + "id": "waterway_tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 14, + "filter": [ + "all", + ["in", "class", "river", "stream", "canal"], + ["==", "brunnel", "tunnel"] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-dasharray": [2, 4], + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 6]]} + } + }, + { + "id": "waterway-other", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["!in", "class", "canal", "river", "stream"], + ["==", "intermittent", 0] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 2]]} + } + }, + { + "id": "waterway-other-intermittent", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["!in", "class", "canal", "river", "stream"], + ["==", "intermittent", 1] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 2]]}, + "line-dasharray": [4, 3] + } + }, + { + "id": "waterway-stream-canal", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["in", "class", "canal", "stream"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 0] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 6]]} + } + }, + { + "id": "waterway-stream-canal-intermittent", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["in", "class", "canal", "stream"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 1] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.3, "stops": [[13, 0.5], [20, 6]]}, + "line-dasharray": [4, 3] + } + }, + { + "id": "waterway-river", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 0] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.2, "stops": [[10, 0.8], [20, 6]]} + } + }, + { + "id": "waterway-river-intermittent", + "type": "line", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 1] + ], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "#a0c8f0", + "line-width": {"base": 1.2, "stops": [[10, 0.8], [20, 6]]}, + "line-dasharray": [3, 2.5] + } + }, + { + "id": "water-offset", + "type": "fill", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "water", + "maxzoom": 8, + "filter": ["==", "$type", "Polygon"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "#a0c8f0", + "fill-opacity": 1, + "fill-translate": {"base": 1, "stops": [[6, [2, 0]], [8, [0, 0]]]} + } + }, + { + "id": "water", + "type": "fill", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "water", + "filter": ["all", ["!=", "intermittent", 1]], + "layout": {"visibility": "visible"}, + "paint": {"fill-color": "hsl(210, 67%, 85%)"} + }, + { + "id": "water-intermittent", + "type": "fill", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "water", + "filter": ["all", ["==", "intermittent", 1]], + "layout": {"visibility": "visible"}, + "paint": {"fill-color": "hsl(210, 67%, 85%)", "fill-opacity": 0.7} + }, + { + "id": "water-pattern", + "type": "fill", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "water", + "filter": ["all"], + "layout": {"visibility": "visible"}, + "paint": {"fill-pattern": "wave", "fill-translate": [0, 2.5]} + }, + { + "id": "landcover-ice-shelf", + "type": "fill", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": ["==", "subclass", "ice_shelf"], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "#fff", + "fill-opacity": {"base": 1, "stops": [[0, 0.9], [10, 0.3]]} + } + }, + { + "id": "landcover-sand", + "type": "fill", + "metadata": {"mapbox:group": "1444849382550.77"}, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": ["all", ["==", "class", "sand"]], + "layout": {"visibility": "visible"}, + "paint": {"fill-color": "rgba(245, 238, 188, 1)", "fill-opacity": 1} + }, + { + "id": "building", + "type": "fill", + "metadata": {"mapbox:group": "1444849364238.8171"}, + "source": "openmaptiles", + "source-layer": "building", + "layout": {"visibility": "none"}, + "paint": { + "fill-antialias": true, + "fill-color": {"base": 1, "stops": [[15.5, "#f2eae2"], [16, "#dfdbd7"]]} + } + }, + { + "id": "building-top", + "type": "fill", + "metadata": {"mapbox:group": "1444849364238.8171"}, + "source": "openmaptiles", + "source-layer": "building", + "layout": {"visibility": "none"}, + "paint": { + "fill-color": "#f2eae2", + "fill-opacity": {"base": 1, "stops": [[13, 0], [16, 1]]}, + "fill-outline-color": "#dfdbd7", + "fill-translate": {"base": 1, "stops": [[14, [0, 0]], [16, [-2, -2]]]} + } + }, + { + "id": "tunnel-service-track-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service", "track"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#cfcdca", + "line-dasharray": [0.5, 0.25], + "line-width": {"base": 1.2, "stops": [[15, 1], [16, 4], [20, 11]]} + } + }, + { + "id": "tunnel-minor-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["==", "class", "minor"]], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#cfcdca", + "line-opacity": {"stops": [[12, 0], [12.5, 1]]}, + "line-width": { + "base": 1.2, + "stops": [[12, 0.5], [13, 1], [14, 4], [20, 15]] + } + } + }, + { + "id": "tunnel-secondary-tertiary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[8, 1.5], [20, 17]]} + } + }, + { + "id": "tunnel-trunk-primary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "tunnel-motorway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#e9ac77", + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "brunnel", "tunnel"], ["==", "class", "path"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "#cba", + "line-dasharray": [1.5, 0.75], + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 4]]} + } + }, + { + "id": "tunnel-service-track", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service", "track"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff", + "line-width": {"base": 1.2, "stops": [[15.5, 0], [16, 2], [20, 7.5]]} + } + }, + { + "id": "tunnel-minor", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["==", "class", "minor_road"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[13.5, 0], [14, 2.5], [20, 11.5]]} + } + }, + { + "id": "tunnel-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff4c6", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 10]]} + } + }, + { + "id": "tunnel-trunk-primary", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fff4c6", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "tunnel-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#ffdaa6", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "tunnel-railway", + "type": "line", + "metadata": {"mapbox:group": "1444849354174.1904"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["==", "class", "rail"]], + "paint": { + "line-color": "#bbb", + "line-dasharray": [2, 2], + "line-width": {"base": 1.4, "stops": [[14, 0.4], [15, 0.75], [20, 2]]} + } + }, + { + "id": "ferry", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["in", "class", "ferry"]], + "layout": {"line-join": "round", "visibility": "none"}, + "paint": { + "line-color": "rgba(108, 159, 182, 1)", + "line-dasharray": [2, 2], + "line-width": 1.1 + } + }, + { + "id": "aeroway-taxiway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 12, + "filter": ["all", ["in", "class", "taxiway"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[11, 2], [17, 12]]} + } + }, + { + "id": "aeroway-runway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 12, + "filter": ["all", ["in", "class", "runway"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-opacity": 1, + "line-width": {"base": 1.5, "stops": [[11, 5], [17, 55]]} + } + }, + { + "id": "aeroway-area", + "type": "fill", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["in", "class", "runway", "taxiway"] + ], + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "rgba(255, 255, 255, 1)", + "fill-opacity": {"base": 1, "stops": [[13, 0], [14, 1]]} + } + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + ["in", "class", "taxiway"], + ["==", "$type", "LineString"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": {"base": 1, "stops": [[11, 0], [12, 1]]}, + "line-width": {"base": 1.5, "stops": [[11, 1], [17, 10]]} + } + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + ["in", "class", "runway"], + ["==", "$type", "LineString"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-opacity": {"base": 1, "stops": [[11, 0], [12, 1]]}, + "line-width": {"base": 1.5, "stops": [[11, 4], [17, 50]]} + } + }, + { + "id": "road_area_pier", + "type": "fill", + "metadata": {}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "Polygon"], ["==", "class", "pier"]], + "layout": {"visibility": "none"}, + "paint": {"fill-antialias": true, "fill-color": "#f8f4f0"} + }, + { + "id": "road_pier", + "type": "line", + "metadata": {}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 0, + "filter": ["all", ["==", "$type", "LineString"], ["in", "class", "pier"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "none" + }, + "paint": { + "line-color": "#f8f4f0", + "line-width": {"base": 1.2, "stops": [[15, 1], [17, 4]]} + } + }, + { + "id": "highway-area", + "type": "fill", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "Polygon"], ["!in", "class", "pier"]], + "layout": {"visibility": "visible"}, + "paint": { + "fill-antialias": false, + "fill-color": "hsla(0, 0%, 89%, 0.56)", + "fill-opacity": 0.9, + "fill-outline-color": "#cfcdca" + } + }, + { + "id": "highway-motorway-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "highway-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "highway-minor-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!=", "brunnel", "tunnel"], + ["in", "class", "minor", "service", "track"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#cfcdca", + "line-opacity": {"stops": [[12, 0], [12.5, 1]]}, + "line-width": { + "base": 1.2, + "stops": [[12, 0.5], [13, 1], [14, 4], [20, 15]] + } + } + }, + { + "id": "highway-secondary-tertiary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[8, 1.5], [20, 17]]} + } + }, + { + "id": "highway-primary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "primary"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[7, 0], [8, 1]]}, + "line-width": { + "base": 1.2, + "stops": [[7, 0], [8, 0.6], [9, 1.5], [20, 22]] + } + } + }, + { + "id": "highway-trunk-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "trunk"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[5, 0], [6, 1]]}, + "line-width": { + "base": 1.2, + "stops": [[5, 0], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "highway-motorway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 4, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": {"stops": [[4, 0], [5, 1]]}, + "line-width": { + "base": 1.2, + "stops": [[4, 0], [5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "highway-path", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["!in", "brunnel", "bridge", "tunnel"], ["==", "class", "path"]] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [1.5, 0.75], + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 4]]} + } + }, + { + "id": "highway-motorway-link", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "highway-link", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "highway-minor", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!=", "brunnel", "tunnel"], + ["in", "class", "minor", "service", "track"] + ] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[13.5, 0], [14, 2.5], [20, 11.5]]} + } + }, + { + "id": "highway-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [8, 0.5], [20, 13]]} + } + }, + { + "id": "highway-primary", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "primary"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[8.5, 0], [9, 0.5], [20, 18]]} + } + }, + { + "id": "highway-trunk", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "trunk"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "highway-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fc8", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "railway-transit", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "transit"], ["!in", "brunnel", "tunnel"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [20, 1]]} + } + }, + { + "id": "railway-transit-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "transit"], ["!in", "brunnel", "tunnel"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 2], [20, 6]]} + } + }, + { + "id": "railway-service", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "rail"], ["has", "service"]] + ], + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [20, 1]]} + } + }, + { + "id": "railway-service-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "class", "rail"], ["has", "service"]] + ], + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 2], [20, 6]]} + } + }, + { + "id": "railway", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!has", "service"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "rail"] + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [15, 0.75], [20, 2]]} + } + }, + { + "id": "railway-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849345966.4436"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + [ + "all", + ["!has", "service"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "rail"] + ] + ], + "paint": { + "line-color": "#bbb", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 3], [20, 8]]} + } + }, + { + "id": "bridge-motorway-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "bridge-link-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [[12, 1], [13, 3], [14, 4], [20, 15]] + } + } + }, + { + "id": "bridge-secondary-tertiary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": {"base": 1.2, "stops": [[8, 1.5], [20, 28]]} + } + }, + { + "id": "bridge-trunk-primary-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "hsl(28, 76%, 67%)", + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 26]] + } + } + }, + { + "id": "bridge-motorway-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [[5, 0.4], [6, 0.6], [7, 1.5], [20, 22]] + } + } + }, + { + "id": "bridge-path-casing", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "brunnel", "bridge"], ["==", "class", "path"]] + ], + "paint": { + "line-color": "#f8f4f0", + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 18]]} + } + }, + { + "id": "bridge-path", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["all", ["==", "brunnel", "bridge"], ["==", "class", "path"]] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [1.5, 0.75], + "line-width": {"base": 1.2, "stops": [[15, 1.2], [20, 4]]} + } + }, + { + "id": "bridge-motorway-link", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway_link"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "bridge-link", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [[12.5, 0], [13, 1.5], [14, 2.5], [20, 11.5]] + } + } + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 20]]} + } + }, + { + "id": "bridge-trunk-primary", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary", "trunk"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fea", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "motorway"] + ], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "#fc8", + "line-width": {"base": 1.2, "stops": [[6.5, 0], [7, 0.5], [20, 18]]} + } + }, + { + "id": "bridge-railway", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "bridge"], ["==", "class", "rail"]], + "paint": { + "line-color": "#bbb", + "line-width": {"base": 1.4, "stops": [[14, 0.4], [15, 0.75], [20, 2]]} + } + }, + { + "id": "bridge-railway-hatching", + "type": "line", + "metadata": {"mapbox:group": "1444849334699.1902"}, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "bridge"], ["==", "class", "rail"]], + "paint": { + "line-color": "#bbb", + "line-dasharray": [0.2, 8], + "line-width": {"base": 1.4, "stops": [[14.5, 0], [15, 3], [20, 8]]} + } + }, + { + "id": "cablecar", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": ["==", "class", "cable_car"], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-width": {"base": 1, "stops": [[11, 1], [19, 2.5]]} + } + }, + { + "id": "cablecar-dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": ["==", "class", "cable_car"], + "layout": {"line-cap": "round", "visibility": "visible"}, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-dasharray": [2, 3], + "line-width": {"base": 1, "stops": [[11, 3], [19, 5.5]]} + } + }, + { + "id": "boundary-land-level-4", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [">=", "admin_level", 4], + ["<=", "admin_level", 8], + ["!=", "maritime", 1] + ], + "layout": {"line-join": "round", "visibility": "visible"}, + "paint": { + "line-color": "#9e9cab", + "line-dasharray": [3, 1, 1, 1], + "line-width": {"base": 1.4, "stops": [[4, 0.4], [5, 1], [12, 3]]} + } + }, + { + "id": "boundary-land-level-2", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + ["==", "admin_level", 2], + ["!=", "maritime", 1], + ["!=", "disputed", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(248, 7%, 66%)", + "line-width": { + "base": 1, + "stops": [[0, 0.6], [4, 1.4], [5, 2], [12, 8]] + } + } + }, + { + "id": "boundary-land-disputed", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": ["all", ["!=", "maritime", 1], ["==", "disputed", 1]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(248, 7%, 70%)", + "line-dasharray": [1, 3], + "line-width": { + "base": 1, + "stops": [[0, 0.6], [4, 1.4], [5, 2], [12, 8]] + } + } + }, + { + "id": "boundary-water", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": ["all", ["in", "admin_level", 2, 4], ["==", "maritime", 1]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(154, 189, 214, 1)", + "line-opacity": {"stops": [[6, 0.6], [10, 1]]}, + "line-width": { + "base": 1, + "stops": [[0, 0.6], [4, 1.4], [5, 2], [12, 8]] + } + } + }, + { + "id": "waterway-name", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 13, + "filter": ["all", ["==", "$type", "LineString"], ["has", "name"]], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": 14, + "visibility": "visible" + }, + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 1.5 + } + }, + { + "id": "parcelles", + "type": "line", + "source": "cadastre", + "source-layer": "parcelles", + "minzoom": 16, + "maxzoom": 24, + "layout": {"visibility": "visible", "line-cap": "butt"}, + "paint": { + "line-color": "#0053b3", + "line-opacity": 0.9, + "line-width": {"stops": [[16, 1], [17, 2]]} + } + }, + { + "id": "parcelles-fill", + "type": "fill", + "source": "cadastre", + "source-layer": "parcelles", + "layout": {"visibility": "visible"}, + "paint": { + "fill-color": "rgba(129, 123, 0, 1)", + "fill-opacity": [ + "case", + ["boolean", ["feature-state", "hover"], false], + 0.7, + 0.1 + ] + } + }, + { + "id": "parcelle-highlighted", + "type": "fill", + "source": "cadastre", + "source-layer": "parcelles", + "filter": ["==", "id", ""], + "paint": { + "fill-color": "rgba(1, 129, 0, 1)", + "fill-opacity": 0.7 + } + }, + { + "id": "sections", + "type": "line", + "source": "cadastre", + "source-layer": "sections", + "minzoom": 12, + "maxzoom": 24, + "layout": {"visibility": "visible"}, + "paint": { + "line-color": "rgba(116, 134, 241, 1)", + "line-opacity": 0.9, + "line-width": 2 + } + }, + { + "id": "communes", + "type": "line", + "source": "decoupage-administratif", + "source-layer": "communes", + "minzoom": 10, + "maxzoom": 24, + "layout": {"visibility": "visible"} + }, + { + "id": "departements", + "type": "line", + "source": "decoupage-administratif", + "source-layer": "departements", + "layout": {"visibility": "visible"} + }, + { + "id": "regions", + "type": "line", + "source": "decoupage-administratif", + "source-layer": "regions", + "layout": {"visibility": "visible"} + }, + { + "id": "water-name-lakeline", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": ["==", "$type", "LineString"], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": 14 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 1.5 + } + }, + { + "id": "water-name-ocean", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": ["all", ["==", "$type", "Point"], ["==", "class", "ocean"]], + "layout": { + "symbol-placement": "point", + "symbol-spacing": 350, + "text-field": "{name:latin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": 14 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 1.5 + } + }, + { + "id": "water-name-other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": ["all", ["==", "$type", "Point"], ["!in", "class", "ocean"]], + "layout": { + "symbol-placement": "point", + "symbol-spacing": 350, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Italic"], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-rotation-alignment": "map", + "text-size": {"stops": [[0, 10], [6, 14]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "#74aee9", + "text-halo-color": "rgba(255,255,255,0.7)", + "text-halo-width": 1.5 + } + }, + { + "id": "road_oneway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", 1], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "icon-image": "oneway", + "icon-padding": 2, + "icon-rotate": 90, + "icon-rotation-alignment": "map", + "icon-size": {"stops": [[15, 0.5], [19, 1]]}, + "symbol-placement": "line", + "symbol-spacing": 75, + "visibility": "visible" + }, + "paint": {"icon-opacity": 0.5} + }, + { + "id": "road_oneway_opposite", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", -1], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "icon-image": "oneway", + "icon-padding": 2, + "icon-rotate": -90, + "icon-rotation-alignment": "map", + "icon-size": {"stops": [[15, 0.5], [19, 1]]}, + "symbol-placement": "line", + "symbol-spacing": 75, + "visibility": "visible" + }, + "paint": {"icon-opacity": 0.5} + }, + { + "id": "highway-name-path", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15.5, + "filter": ["==", "class", "path"], + "layout": { + "symbol-placement": "line", + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "map", + "text-size": {"base": 1, "stops": [[13, 12], [14, 13]]} + }, + "paint": { + "text-color": "hsl(30, 23%, 62%)", + "text-halo-color": "#f8f4f0", + "text-halo-width": 0.5 + } + }, + { + "id": "highway-name-minor", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["in", "class", "minor", "service", "track"] + ], + "layout": { + "symbol-placement": "line", + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "map", + "text-size": {"base": 1, "stops": [[13, 12], [14, 13]]} + }, + "paint": { + "text-color": "#765", + "text-halo-blur": 0.5, + "text-halo-width": 1 + } + }, + { + "id": "highway-name-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 12.2, + "filter": ["in", "class", "primary", "secondary", "tertiary", "trunk"], + "layout": { + "symbol-placement": "line", + "text-field": "{name:latin} {name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "map", + "text-size": {"base": 1, "stops": [[13, 12], [14, 13]]} + }, + "paint": { + "text-color": "#765", + "text-halo-blur": 0.5, + "text-halo-width": 1 + } + }, + { + "id": "highway-shield", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 8, + "filter": [ + "all", + ["<=", "ref_length", 6], + ["==", "$type", "LineString"], + ["!in", "network", "us-interstate", "us-highway", "us-state"] + ], + "layout": { + "icon-image": "road_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": {"base": 1, "stops": [[10, "point"], [11, "line"]]}, + "symbol-spacing": 200, + "text-field": "{ref}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": {} + }, + { + "id": "highway-shield-us-interstate", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 7, + "filter": [ + "all", + ["<=", "ref_length", 6], + ["==", "$type", "LineString"], + ["in", "network", "us-interstate"] + ], + "layout": { + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": { + "base": 1, + "stops": [[7, "point"], [7, "line"], [8, "line"]] + }, + "symbol-spacing": 200, + "text-field": "{ref}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": {"text-color": "rgba(0, 0, 0, 1)"} + }, + { + "id": "highway-shield-us-other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 9, + "filter": [ + "all", + ["<=", "ref_length", 6], + ["==", "$type", "LineString"], + ["in", "network", "us-highway", "us-state"] + ], + "layout": { + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": {"base": 1, "stops": [[10, "point"], [11, "line"]]}, + "symbol-spacing": 200, + "text-field": "{ref}", + "text-font": ["Noto Sans Regular"], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": {"text-color": "rgba(0, 0, 0, 1)"} + }, + { + "id": "airport-label-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "aerodrome_label", + "minzoom": 10, + "filter": ["all", ["has", "iata"]], + "layout": { + "icon-image": "airport_11", + "icon-size": 1, + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-optional": true, + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + } + }, + { + "id": "poi-level-3", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 16, + "filter": [ + "all", + ["==", "$type", "Point"], + [">=", "rank", 25], + ["any", ["!has", "level"], ["==", "level", 0]] + ], + "layout": { + "icon-image": "{class}_11", + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + } + }, + { + "id": "poi-level-2", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "Point"], + ["<=", "rank", 24], + [">=", "rank", 15], + ["any", ["!has", "level"], ["==", "level", 0]] + ], + "layout": { + "icon-image": "{class}_11", + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + } + }, + { + "id": "poi-level-1", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + ["==", "$type", "Point"], + ["<=", "rank", 14], + ["has", "name"], + ["any", ["!has", "level"], ["==", "level", 0]] + ], + "layout": { + "icon-image": "{class}_11", + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-padding": 2, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + } + }, + { + "id": "poi-railway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "Point"], + ["has", "name"], + ["==", "class", "railway"], + ["==", "subclass", "station"] + ], + "layout": { + "icon-allow-overlap": false, + "icon-ignore-placement": false, + "icon-image": "{class}_11", + "icon-optional": false, + "text-allow-overlap": false, + "text-anchor": "top", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-ignore-placement": false, + "text-max-width": 9, + "text-offset": [0, 0.6], + "text-optional": true, + "text-padding": 2, + "text-size": 12 + }, + "paint": { + "text-color": "#666", + "text-halo-blur": 0.5, + "text-halo-color": "#ffffff", + "text-halo-width": 1 + } + }, + { + "id": "place-other", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "!in", + "class", + "city", + "town", + "village", + "country", + "continent" + ], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Bold"], + "text-letter-spacing": 0.1, + "text-max-width": 9, + "text-size": {"base": 1.2, "stops": [[12, 10], [15, 14]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#633", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-village", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["==", "class", "village"], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-size": {"base": 1.2, "stops": [[10, 12], [15, 22]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-town", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["==", "class", "town"], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-size": {"base": 1.2, "stops": [[10, 14], [15, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-city", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["all", ["!=", "capital", 2], ["==", "class", "city"]], + "layout": { + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-size": {"base": 1.2, "stops": [[7, 14], [11, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-city-capital", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": ["all", ["==", "capital", 2], ["==", "class", "city"]], + "layout": { + "icon-image": "star_11", + "icon-size": 0.8, + "text-anchor": "left", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-font": ["Noto Sans Regular"], + "text-max-width": 8, + "text-offset": [0.4, 0], + "text-size": {"base": 1.2, "stops": [[7, 14], [11, 24]]}, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "place-country-other", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + [">=", "rank", 3], + ["!has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Italic"], + "text-max-width": 6.25, + "text-size": {"stops": [[3, 11], [7, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-country-3", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + [">=", "rank", 3], + ["has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": {"stops": [[3, 11], [7, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-country-2", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + ["==", "rank", 2], + ["has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": {"stops": [[2, 11], [5, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-country-1", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + ["==", "class", "country"], + ["==", "rank", 1], + ["has", "iso_a2"] + ], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": {"stops": [[1, 11], [4, 17]]}, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "place-continent", + "type": "symbol", + "metadata": {"mapbox:group": "1444849242106.713"}, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 1, + "filter": ["==", "class", "continent"], + "layout": { + "text-field": "{name:latin}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": 14, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-color": "#334", + "text-halo-blur": 1, + "text-halo-color": "rgba(255,255,255,0.8)", + "text-halo-width": 2 + } + }, + { + "id": "code-section", + "type": "symbol", + "source": "cadastre", + "source-layer": "sections", + "minzoom": 12.5, + "maxzoom": 16, + "layout": { + "text-field": "{code}", + "text-font": ["Lato Bold"], + "visibility": "visible" + }, + "paint": { + "text-halo-color": "rgba(255, 246, 241, 1)", + "text-halo-width": 1.5 + } + }, + { + "id": "code-parcelles", + "type": "symbol", + "source": "cadastre", + "source-layer": "parcelles", + "minzoom": 16, + "filter": ["all"], + "layout": { + "text-field": "{numero}", + "text-font": ["Lato Bold"], + "text-allow-overlap": false, + "visibility": "visible", + "text-size": 16 + }, + "paint": { + "text-halo-color": "#fff6f1", + "text-halo-width": 1.5, + "text-translate-anchor": "map" + } + } + ], + "id": "bright" +} diff --git a/app/javascript/components/MapEditor/utils.js b/app/javascript/components/MapEditor/utils.js new file mode 100644 index 000000000..9be234855 --- /dev/null +++ b/app/javascript/components/MapEditor/utils.js @@ -0,0 +1,18 @@ +export const ERROR_GEO_JSON = ''; +export const createFeatureCollection = selectionsUtilisateur => { + return { + type: 'FeatureCollection', + features: selectionsUtilisateur + }; +}; + +export const polygonCadastresFill = { + 'fill-color': '#EC3323', + 'fill-opacity': 0.3 +}; + +export const polygonCadastresLine = { + 'line-color': 'rgba(255, 0, 0, 1)', + 'line-width': 4, + 'line-dasharray': [1, 1] +}; diff --git a/app/javascript/loaders/MapEditor.js b/app/javascript/loaders/MapEditor.js new file mode 100644 index 000000000..7f9acce8c --- /dev/null +++ b/app/javascript/loaders/MapEditor.js @@ -0,0 +1,3 @@ +import Loadable from '../components/Loadable'; + +export default Loadable(() => import('../components/MapEditor/MapEditor')); diff --git a/app/views/champs/carte/show.js.erb b/app/views/champs/carte/show.js.erb index a34b4d2b4..f36252efc 100644 --- a/app/views/champs/carte/show.js.erb +++ b/app/views/champs/carte/show.js.erb @@ -4,5 +4,8 @@ partial: 'shared/champs/carte/geo_areas', locals: { champ: @champ, error: @error }) %> -<%= fire_event('carte:update', { selector: @selector, data: @champ.to_render_data }.to_json) %> -<%= fire_event('map:update', { featureCollection: @champ.to_feature_collection }.to_json) %> +<% if feature_enabled?(:new_map_editor) %> + <%= fire_event('map:update', { featureCollection: @champ.to_feature_collection }.to_json) %> +<% else %> + <%= fire_event('carte:update', { selector: @selector, data: @champ.to_render_data }.to_json) %> +<% end %> diff --git a/app/views/shared/dossiers/editable_champs/_carte.html.haml b/app/views/shared/dossiers/editable_champs/_carte.html.haml index e15e1f6c6..4399929b6 100644 --- a/app/views/shared/dossiers/editable_champs/_carte.html.haml +++ b/app/views/shared/dossiers/editable_champs/_carte.html.haml @@ -1,11 +1,13 @@ -.toolbar - %button.button.primary.new-area Ajouter une zone - %select.select2.adresse{ data: { address: true }, placeholder: 'Saisissez une adresse ou positionner la carte' } - -.carte.edit{ data: { geo: geo_data(champ) }, class: "carte-#{form.index}" } +- if feature_enabled?(:new_map_editor) + = react_component("MapEditor", { featureCollection: champ.to_feature_collection }, class: "carte-#{form.index}") +- else + .toolbar + %button.button.primary.new-area Ajouter une zone + %select.select2.adresse{ data: { address: true }, placeholder: 'Saisissez une adresse ou positionner la carte' } + .carte.edit{ data: { geo: geo_data(champ) }, class: "carte-#{form.index}" } .geo-areas = render partial: 'shared/champs/carte/geo_areas', locals: { champ: champ, error: false } = form.hidden_field :value, - data: { remote: true, url: champs_carte_path(form.index), params: champ_carte_params(champ).to_query, method: 'post' } + data: { remote: true, feature_collection_id: champ.type_de_champ.stable_id, url: champs_carte_path(form.index), params: champ_carte_params(champ).to_query, method: 'post' } diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 82025de9c..df78f48c1 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -7,6 +7,8 @@ Rails.application.config.assets.version = '1.0' Rails.application.config.assets.paths << Rails.root.join('node_modules', 'trix', 'dist') Rails.application.config.assets.paths << Rails.root.join('node_modules', 'select2', 'dist', 'css') Rails.application.config.assets.paths << Rails.root.join('node_modules', 'mapbox-gl', 'dist') +Rails.application.config.assets.paths << Rails.root.join('node_modules', '@reach', 'combobox') +Rails.application.config.assets.paths << Rails.root.join('node_modules', '@mapbox', 'mapbox-gl-draw', 'dist') # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index 4c0a47886..f33a119f6 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -8,7 +8,7 @@ Rails.application.config.content_security_policy do |policy| # c'est trop compliqué pour être rectifié immédiatement (et sans valeur ajoutée: # c'est hardcodé dans les vues, donc pas injectable). policy.style_src :self, "*.crisp.chat", "crisp.chat", :unsafe_inline - policy.connect_src :self, "wss://*.crisp.chat", "*.crisp.chat", "*.demarches-simplifiees.fr", "in-automate.sendinblue.com", "app.franceconnect.gouv.fr", "sentry.io", "geo.api.gouv.fr", "api-adresse.data.gouv.fr", "openmaptiles.geo.data.gouv.fr", "openmaptiles.github.io" + policy.connect_src :self, "wss://*.crisp.chat", "*.crisp.chat", "*.demarches-simplifiees.fr", "in-automate.sendinblue.com", "app.franceconnect.gouv.fr", "sentry.io", "geo.api.gouv.fr", "api-adresse.data.gouv.fr", "openmaptiles.geo.data.gouv.fr", "openmaptiles.github.io", "tiles.geo.api.gouv.fr" # Pour tout le reste, par défaut on accepte uniquement ce qui vient de chez nous # et dans la notification on inclue la source de l'erreur policy.default_src :self, :data, :report_sample, "fonts.gstatic.com", "in-automate.sendinblue.com", "player.vimeo.com", "app.franceconnect.gouv.fr", "sentry.io", "static.demarches-simplifiees.fr", "*.crisp.chat", "crisp.chat", "*.crisp.help", "*.sibautomation.com", "sibautomation.com", "data" diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb index e19f6e978..14bb0105a 100644 --- a/config/initializers/flipper.rb +++ b/config/initializers/flipper.rb @@ -32,6 +32,7 @@ features = [ :instructeur_bypass_email_login_token, :autosave_dossier_draft, :autoupload_dossier_attachments, + :new_map_editor, :maintenance_mode, :mini_profiler, :operation_log_serialize_subject, diff --git a/db/schema.rb b/db/schema.rb index 2f59b5fe7..bc2fec001 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -255,10 +255,10 @@ ActiveRecord::Schema.define(version: 2020_04_22_090426) do t.datetime "brouillon_close_to_expiration_notice_sent_at" t.datetime "groupe_instructeur_updated_at" t.datetime "en_construction_close_to_expiration_notice_sent_at" + t.interval "en_construction_conservation_extension", default: "PT0S" + t.datetime "termine_close_to_expiration_notice_sent_at" t.index "to_tsvector('french'::regconfig, (search_terms || private_search_terms))", name: "index_dossiers_on_search_terms_private_search_terms", using: :gin t.index "to_tsvector('french'::regconfig, search_terms)", name: "index_dossiers_on_search_terms", using: :gin - t.interval "en_construction_conservation_extension", default: "00:00:00" - t.datetime "termine_close_to_expiration_notice_sent_at" t.index ["archived"], name: "index_dossiers_on_archived" t.index ["groupe_instructeur_id"], name: "index_dossiers_on_groupe_instructeur_id" t.index ["hidden_at"], name: "index_dossiers_on_hidden_at" diff --git a/package.json b/package.json index 5cfd2b229..091c8f193 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,12 @@ "@fortawesome/fontawesome-svg-core": "^1.2.26", "@fortawesome/free-solid-svg-icons": "^5.12.0", "@fortawesome/react-fontawesome": "^0.1.8", + "@mapbox/mapbox-gl-draw": "^1.1.2", "@rails/actiontext": "^6.0.2-1", "@rails/activestorage": "^6.0.2-1", "@rails/ujs": "^6.0.2-1", "@rails/webpacker": "4.2.2", + "@reach/combobox": "^0.10.0", "@sentry/browser": "^5.11.2", "@turf/area": "^6.0.1", "babel-plugin-macros": "^2.8.0", @@ -29,6 +31,7 @@ "react-intersection-observer": "^8.25.2", "react-loadable": "^5.5.0", "react-mapbox-gl": "^4.8.3", + "react-mapbox-gl-draw": "^2.0.4", "react-scroll-to-component": "^1.0.2", "react-sortable-hoc": "^1.11.0", "react_ujs": "^2.6.1", diff --git a/yarn.lock b/yarn.lock index 3dddf088a..e7093e5ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -957,13 +957,41 @@ dependencies: prop-types "^15.5.10" -"@mapbox/geojson-area@0.2.2": +"@mapbox/extent@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@mapbox/extent/-/extent-0.4.0.tgz#3e591f32e1f0c3981c864239f7b0ac06e610f8a9" + integrity sha1-PlkfMuHww5gchkI597CsBuYQ+Kk= + +"@mapbox/geojson-area@0.2.2", "@mapbox/geojson-area@^0.2.1": version "0.2.2" resolved "https://registry.yarnpkg.com/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz#18d7814aa36bf23fbbcc379f8e26a22927debf10" integrity sha1-GNeBSqNr8j+7zDefjiaiKSfevxA= dependencies: wgs84 "0.0.0" +"@mapbox/geojson-coords@0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-coords/-/geojson-coords-0.0.0.tgz#4847a5b96059666e527a2139e75e35d84fd58f50" + integrity sha1-SEeluWBZZm5SeiE551412E/Vj1A= + dependencies: + "@mapbox/geojson-normalize" "0.0.1" + geojson-flatten "~0.2.1" + +"@mapbox/geojson-extent@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-extent/-/geojson-extent-0.3.2.tgz#a1bdb2015afd0e031c18c3f29f7eb229e4e1950f" + integrity sha1-ob2yAVr9DgMcGMPyn36yKeThlQ8= + dependencies: + "@mapbox/extent" "0.4.0" + "@mapbox/geojson-coords" "0.0.0" + rw "~0.1.4" + traverse "~0.6.6" + +"@mapbox/geojson-normalize@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-normalize/-/geojson-normalize-0.0.1.tgz#1da1e6b3a7add3ad29909b30f438f60581b7cd80" + integrity sha1-HaHms6et060pkJsw9Dj2BYG3zYA= + "@mapbox/geojson-rewind@^0.4.0": version "0.4.1" resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.4.1.tgz#357d79300adb7fec7c1f091512988bca6458f068" @@ -979,11 +1007,36 @@ resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== +"@mapbox/geojsonhint@^2.0.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/geojsonhint/-/geojsonhint-2.2.0.tgz#75ca94706e9a56e6debf4e1c78fabdc67978b883" + integrity sha512-8qQYRB+/2z2JsN5s6D0WAnpo69+3V3nvJsSFLwMB1dsaWz1V4oZeuoje9srbYAxxL8PXCwIywfhYa3GxOkBv5Q== + dependencies: + concat-stream "^1.6.1" + jsonlint-lines "1.7.1" + minimist "1.2.0" + vfile "^4.0.0" + vfile-reporter "^5.1.1" + "@mapbox/jsonlint-lines-primitives@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= +"@mapbox/mapbox-gl-draw@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.1.2.tgz#247b3f0727db34c2641ab718df5eebeee69a2585" + integrity sha512-DWtATUAnJaGZYoH/y2O+QTRybxrp5y3w3eV5FXHFNVcKsCAojKEMB8ALKUG2IsiCKqV/JCAguK9AlPWR7Bjafw== + dependencies: + "@mapbox/geojson-area" "^0.2.1" + "@mapbox/geojson-extent" "^0.3.2" + "@mapbox/geojson-normalize" "0.0.1" + "@mapbox/geojsonhint" "^2.0.0" + "@mapbox/point-geometry" "0.1.0" + hat "0.0.3" + lodash.isequal "^4.2.0" + xtend "^4.0.1" + "@mapbox/mapbox-gl-supported@^1.4.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" @@ -1086,6 +1139,78 @@ webpack-cli "^3.3.10" webpack-sources "^1.4.3" +"@reach/auto-id@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/auto-id/-/auto-id-0.10.0.tgz#72b70b9bb3f7d0f39b9fae0dcb412168ee139762" + integrity sha512-Uwsd4eNFa5YteZ7DKCVIbhE3c8x9DYVwtLy6ZCl1jo6bXAF6Di1dYm/XnkTmo+OYoKOZlVTu7umONDeezY33rQ== + dependencies: + "@reach/utils" "^0.10.0" + tslib "^1.10.0" + +"@reach/combobox@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/combobox/-/combobox-0.10.0.tgz#5735a0f8c32019402dad7590562e5ccdb92e760a" + integrity sha512-UMgPPF3s8pcO+GQ8lT1qmyxZri2NuEX/HLPhNJlog7V7yBCdCRrFT5KdLDlIqg6I3jHy52n9Q4DrxMJiLp1ZJw== + dependencies: + "@reach/auto-id" "^0.10.0" + "@reach/descendants" "^0.10.0" + "@reach/popover" "^0.10.0" + "@reach/portal" "^0.10.0" + "@reach/utils" "^0.10.0" + highlight-words-core "1.2.2" + prop-types "^15.7.2" + tslib "^1.10.0" + +"@reach/descendants@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/descendants/-/descendants-0.10.0.tgz#43eeba4aea10ffc62fe5144248c1455ab317964b" + integrity sha512-G7wm0poMVR+aT9W5O8C6cnrZBYskIAfgBfPwByOY7F6TwEj7HqHDs7tZ/3Paj6UIZZ9lkVfhHPEGGvfOpEXhlg== + dependencies: + "@reach/utils" "^0.10.0" + tslib "^1.10.0" + +"@reach/observe-rect@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@reach/observe-rect/-/observe-rect-1.1.0.tgz#4e967a93852b6004c3895d9ed8d4e5b41895afde" + integrity sha512-kE+jvoj/OyJV24C03VvLt5zclb9ArJi04wWXMMFwQvdZjdHoBlN4g0ZQFjyy/ejPF1Z/dpUD5dhRdBiUmIGZTA== + +"@reach/popover@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/popover/-/popover-0.10.0.tgz#054601f98ef1616a0d439be4dafd8cf7ac172da6" + integrity sha512-Iff9qHuJypxdG7a6IiAZFFgpbfQK9v3FH+GDsdZiKLbtmRDIMC3AM8ebkBTKUAnEsumHekBrk8cf9WAIJVz1jg== + dependencies: + "@reach/portal" "^0.10.0" + "@reach/rect" "^0.10.0" + "@reach/utils" "^0.10.0" + tabbable "^4.0.0" + tslib "^1.10.0" + +"@reach/portal@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.10.0.tgz#ed119d796de1b5ea7c975007fa6b2e507bc7567e" + integrity sha512-soXCiLDWcyXMgs1pArjdt67d+IARu1rpkOmHWD3c7XDE2hanWVeQiGC4L8UVNrm51pWrCDtLH1R446tG6uNz2Q== + dependencies: + "@reach/utils" "^0.10.0" + tslib "^1.10.0" + +"@reach/rect@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/rect/-/rect-0.10.0.tgz#5e9310592f1a9413382c4a8a80e96ca167d2f32d" + integrity sha512-fZLZiBDc/ZDSNnNFZCQFHOw4v8QLI/DjWbX+JecXVGIhgwBUl4+3cJVmlthk/FUrndO7cQ8vjFWzEhB4o2mOnw== + dependencies: + "@reach/observe-rect" "^1.1.0" + "@reach/utils" "^0.10.0" + prop-types "^15.7.2" + tslib "^1.10.0" + +"@reach/utils@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.10.0.tgz#480332433f9d0232aff2c36374cf9a2fe559990b" + integrity sha512-qPiwjw8jcT7JYrVT+ZO7bLTVEdp9KyvY0RO1emyCxqpYVr4s9oSZ3XG6n7G+bvnKeyjpbpIfCVfxYvPF1Uq2DQ== + dependencies: + tslib "^1.10.0" + warning "^4.0.3" + "@sentry/browser@^5.11.2": version "5.15.4" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.4.tgz#5a7e7bad088556665ed8e69bceb0e18784e4f6c7" @@ -1226,6 +1351,11 @@ dependencies: "@types/geojson" "*" +"@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" + integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1381,6 +1511,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"JSV@>= 4.0.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + integrity sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c= + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1550,6 +1685,11 @@ ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= + ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -2279,6 +2419,15 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -2613,7 +2762,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@^1.6.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4199,6 +4348,14 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +geojson-flatten@~0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/geojson-flatten/-/geojson-flatten-0.2.4.tgz#8f3396f31a0f5b747e39c9e6a14088f43ba4ecfb" + integrity sha512-LiX6Jmot8adiIdZ/fthbcKKPOfWjTQchX/ggHnwMZ2e4b0I243N1ANUos0LvnzepTEsj0+D4fIJ5bKhBrWnAHA== + dependencies: + get-stdin "^6.0.0" + minimist "1.2.0" + geojson-vt@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" @@ -4490,6 +4647,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4564,6 +4726,11 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hat@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a" + integrity sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo= + hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" @@ -4574,6 +4741,11 @@ highcharts@^8.0.0: resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-8.0.0.tgz#fcf77a511d6ea477b9d8447afd9dedbfc85e2727" integrity sha512-jRKLiP0i29zKSEgMDASyrfpivrM3e8V8yTv8YUZtRzB2mXR+hsBNHWZw2hNRZVxqq1QCVmW/9Z/BLFvYlJELqA== +highlight-words-core@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/highlight-words-core/-/highlight-words-core-1.2.2.tgz#1eff6d7d9f0a22f155042a00791237791b1eeaaa" + integrity sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg== + highlight.js@~9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" @@ -4969,6 +5141,11 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + is-buffer@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" @@ -5338,6 +5515,14 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonlint-lines@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/jsonlint-lines/-/jsonlint-lines-1.7.1.tgz#507de680d3fb8c4be1641cc57d6f679f29f178ff" + integrity sha1-UH3mgNP7jEvhZBzFfW9nnynxeP8= + dependencies: + JSV ">= 4.0.x" + nomnom ">= 1.5.x" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5566,6 +5751,11 @@ lodash.has@^4.0: resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= +lodash.isequal@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -5908,7 +6098,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -6164,6 +6354,14 @@ node-sass@^4.13.0: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +"nomnom@>= 1.5.x": + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + integrity sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc= + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -7695,6 +7893,11 @@ react-loadable@^5.5.0: dependencies: prop-types "^15.5.0" +react-mapbox-gl-draw@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-mapbox-gl-draw/-/react-mapbox-gl-draw-2.0.4.tgz#476d70a6efc07c329fa61c11022bcdab60ac4b91" + integrity sha512-oaBdIlyu+g7PhLUvwnCsl/wvu+5tGB9I3RLjcrYLt6U1sUMzQJqplKtVxXRv9TZqRdNaAU5qNOP+dRs55QKjsA== + react-mapbox-gl@^4.8.3: version "4.8.3" resolved "https://registry.yarnpkg.com/react-mapbox-gl/-/react-mapbox-gl-4.8.3.tgz#11f5901fe26a4c704a6a22e797bd69404c320e47" @@ -7917,7 +8120,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.6.1: +repeat-string@^1.5.0, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -7929,7 +8132,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -replace-ext@^1.0.0: +replace-ext@1.0.0, replace-ext@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= @@ -8114,6 +8317,11 @@ rw@^1.3.3: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= +rw@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/rw/-/rw-0.1.4.tgz#4903cbd80248ae0ede685bf58fd236a7a9b29a3e" + integrity sha1-SQPL2AJIrg7eaFv1j9I2p6mymj4= + rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" @@ -8768,6 +8976,11 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -8828,7 +9041,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0: +supports-color@^5.0.0, supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -8861,6 +9074,11 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" +tabbable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-4.0.0.tgz#5bff1d1135df1482cf0f0206434f15eadbeb9261" + integrity sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ== + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -9073,6 +9291,11 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +traverse@~0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -9105,7 +9328,7 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== @@ -9179,6 +9402,11 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -9244,6 +9472,13 @@ unique-stream@^2.0.2: json-stable-stringify-without-jsonify "^1.0.1" through2-filter "^3.0.0" +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -9391,6 +9626,47 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-reporter@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/vfile-reporter/-/vfile-reporter-5.1.2.tgz#80f1db5cbe8f9c12f2f30cce3e2cd18353a48519" + integrity sha512-b15sTuss1wOPWVlyWOvu+n6wGJ/eTYngz3uqMLimQvxZ+Q5oFQGYZZP1o3dR9sk58G5+wej0UPCZSwQBX/mzrQ== + dependencies: + repeat-string "^1.5.0" + string-width "^2.0.0" + supports-color "^5.0.0" + unist-util-stringify-position "^2.0.0" + vfile-sort "^2.1.2" + vfile-statistics "^1.1.0" + +vfile-sort@^2.1.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/vfile-sort/-/vfile-sort-2.2.2.tgz#720fe067ce156aba0b411a01bb0dc65596aa1190" + integrity sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA== + +vfile-statistics@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/vfile-statistics/-/vfile-statistics-1.1.4.tgz#b99fd15ecf0f44ba088cc973425d666cb7a9f245" + integrity sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA== + +vfile@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.1.0.tgz#d79248957f43225d57ff67a56effc67bef08946e" + integrity sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + vinyl-fs@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" @@ -9453,6 +9729,13 @@ vt-pbf@^3.1.1: "@mapbox/vector-tile" "^1.3.1" pbf "^3.0.5" +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack@^1.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" @@ -9718,7 +10001,7 @@ xmlbuilder@^10.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== From 053e2db8f7d8cefcae9b33bdbd59fbddf9fee594 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 28 Apr 2020 12:21:22 +0200 Subject: [PATCH 2/4] Fix geos not being properly load in some environements --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 8ac290dc6..ad8c4a59b 100644 --- a/Gemfile +++ b/Gemfile @@ -25,6 +25,7 @@ gem 'devise' # Gestion des comptes utilisateurs gem 'devise-async' gem 'discard' gem 'dotenv-rails', require: 'dotenv/rails-now' # dotenv should always be loaded before rails +gem 'ffi-geos', require: false gem 'flipper' gem 'flipper-active_record' gem 'flipper-ui' From 1ac7ec2dcaa957ec03ba3f2703dd9f339665f45d Mon Sep 17 00:00:00 2001 From: clemkeirua Date: Fri, 24 Apr 2020 15:42:01 +0200 Subject: [PATCH 3/4] precision dans mail suppression dossier en construction --- .../dossier_mailer/notify_near_deletion_to_user.html.haml | 3 +++ .../views/dossier_mailer/notify_near_deletion_to_user/fr.yml | 3 +++ spec/mailers/dossier_mailer_spec.rb | 1 + 3 files changed, 7 insertions(+) diff --git a/app/views/dossier_mailer/notify_near_deletion_to_user.html.haml b/app/views/dossier_mailer/notify_near_deletion_to_user.html.haml index 83455024a..a4af7f504 100644 --- a/app/views/dossier_mailer/notify_near_deletion_to_user.html.haml +++ b/app/views/dossier_mailer/notify_near_deletion_to_user.html.haml @@ -15,5 +15,8 @@ %p = sanitize(t('.footer', count: @dossiers.count)) +%p + - if @state == Dossier.states.fetch(:en_construction) + = sanitize(t('.footer_en_construction', count: @dossiers.count)) = render partial: "layouts/mailers/signature" diff --git a/config/locales/views/dossier_mailer/notify_near_deletion_to_user/fr.yml b/config/locales/views/dossier_mailer/notify_near_deletion_to_user/fr.yml index 3a0098335..f410d7658 100644 --- a/config/locales/views/dossier_mailer/notify_near_deletion_to_user/fr.yml +++ b/config/locales/views/dossier_mailer/notify_near_deletion_to_user/fr.yml @@ -16,3 +16,6 @@ fr: footer: one: "Vous pouvez retrouver votre dossier pendant encore un mois. Vous n’avez rien à faire." other: "Vous pouvez retrouver vos dossiers pendant encore un mois. Vous n’avez rien à faire." + footer_en_construction: + one: "Si vous souhaitez conserver votre dossier plus longtemps, vous pouvez prolonger sa durée de conservation dans l'interface." + other: "Si vous souhaitez conserver vos dossiers plus longtemps, vous pouvez prolonger leur durée de conservation au cas par cas dans l'interface." diff --git a/spec/mailers/dossier_mailer_spec.rb b/spec/mailers/dossier_mailer_spec.rb index d7ab78474..b2d577feb 100644 --- a/spec/mailers/dossier_mailer_spec.rb +++ b/spec/mailers/dossier_mailer_spec.rb @@ -165,6 +165,7 @@ RSpec.describe DossierMailer, type: :mailer do it { expect(subject.body).to include(dossier.procedure.libelle) } it { expect(subject.body).to include("PDF") } it { expect(subject.body).to include("Vous pouvez retrouver votre dossier pendant encore un mois. Vous n’avez rien à faire.") } + it { expect(subject.body).to include("Si vous souhaitez conserver votre dossier plus longtemps, vous pouvez prolonger sa durée de conservation dans l'interface.") } end describe 'termine' do From 920cf6bb3f0666889e80bec6b581742c41961d07 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 28 Apr 2020 14:58:16 +0200 Subject: [PATCH 4/4] fix bundle install --- Gemfile.lock | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 622f366fb..0958a8495 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -215,6 +215,8 @@ GEM faraday (0.15.4) multipart-post (>= 1.2, < 3) ffi (1.12.2) + ffi-geos (2.1.0) + ffi (>= 1.0.0) flipper (0.17.2) flipper-active_record (0.17.2) activerecord (>= 4.2, < 7) @@ -751,6 +753,7 @@ DEPENDENCIES discard dotenv-rails factory_bot + ffi-geos flipper flipper-active_record flipper-ui