/* MAP CONTAINER */ #map { height: 95vh; width: 95vw; position: absolute; top: 0; bottom: 0; margin-top: 1rem; } /* MAP NAV MENU */ #menu { background: #fff; position: relative; z-index: 1; top: 8px; left: 0px; border-radius: 3px; width: 144px; border: 1px solid rgba(0, 0, 0, 0.4); font-family: "Open Sans", sans-serif; } #menu a { font-size: 13px; color: #404040; background-color: rgb(226, 226, 226); display: block; margin: 0; text-decoration: none; border-bottom: 1px solid rgba(0, 0, 0, 0.25); text-align: center; padding: 5px 0; letter-spacing: 0.5px; } #menu a:last-child { border: none; } #menu a:hover { background-color: #f8f8f8; color: #404040; } #menu a.active { background-color: #3887be; color: #ffffff; } #menu a.active:hover { background: #3074a4; } /* PRINT BUTTON */ #btn { position: absolute; bottom: 5rem; left: 72px; z-index: 1; background-color: #fff; border: 1px solid #ccc; border-radius: 3px; padding: 10px; font-family: Arial, sans-serif; cursor: pointer; } @media print { .pe-no-print { display: none !important; } .pe-preserve-ancestor { display: block !important; margin: 0 !important; padding: 0 !important; border: none !important; box-shadow: none !important; } } /* asdf */
// MAIN MAP mapboxgl.accessToken = "pk.eyJ1IjoiZXNlLXRvaCIsImEiOiJja2Vhb24xNTEwMDgxMzFrYjVlaTVjOXkxIn0.IsPo5lOndNUc3lDLuBa1ZA" const map = new mapboxgl.Map({ container: "map", // container ID style: "mapbox://styles/ese-toh/clumzo6rn000d01qq1ay7a8b5", // MONOCHROME center: [-69.9617, 41.68258], // starting position (lng, lat) zoom: 9, //starting zoom }) // MAP LAYER IMPORTS import { addSatelliteLayer } from "./layers/satellite.js" import { addContoursLayer } from "./layers/contours.js" import { addHistoricLayer } from "./layers/historic.js" import { addAcecLayer } from "./layers/acec.js" import { addZoneTwoLayer } from "./layers/zone-two.js" import { addPriorityHabitatLayer } from "./layers/priority-habitat.js" import { addVernalPoolsLayer } from "./layers/vernal-pools.js" import { addSoilsLayer } from "./layers/soils.js" import { addEstimatedHabitatLayer } from "./layers/estimated-habitat.js" import { addDepWetlandLayer } from "./layers/dep-wetland.js" import { addDepWetlandLineLayer } from "./layers/dep-wetland-line.js" import { addLimwaLayer } from "./layers/limwa.js" import { addParcelsLayer } from "./layers/parcels.js" import { addConservancyDistrictsLayer } from "./layers/conservancy-districts.js" import { addZoningLayer } from "./layers/zoning.js" import { addAgisLayer } from "./layers/agis.js" import { addConservationLayer } from "./layers/conservation.js" import { addTownsLayer } from "./layers/towns.js" import { addTownParcelsLayer } from "./layers/town-parcels.js" import { addSewerLayer } from "./layers/sewer.js" import { addStoriesLayer } from "./layers/stories.js" import { addIntersectionLayer } from "./layers/Intersection.js" import { addParcelHighlightLayer } from "./layers/parcel-highlight.js" import { addOwnerLocationLayer } from "./layers/owner-location.js" // MAP LAYER FUNCTIONS const mapLayerFunctions = [ // SATELLITE addSatelliteLayer(map), // CONTOURS addContoursLayer(map), // HISTORIC addHistoricLayer(map), // ACEC addAcecLayer(map), // ZONE II addZoneTwoLayer(map), // TOWNS (DEFAULT BORDER HIGHLIGHT) addTownsLayer(map), // PRIORITY HABITAT addPriorityHabitatLayer(map), // ESTIMATED HABITAT addEstimatedHabitatLayer(map), // VERNAL POOLS addVernalPoolsLayer(map), // SOILS addSoilsLayer(map), // DEP WETLAND addDepWetlandLayer(map), // DEP WETLAND LINE addDepWetlandLineLayer(map), // LiMWA (FLOODPLAIN) addLimwaLayer(map), // PARCELS addParcelsLayer(map), // CONSERVANCY DISTRICTS addConservancyDistrictsLayer(map), // ZONING addZoningLayer(map), // AGIS addAgisLayer(map), // CONSERVATION addConservationLayer(map), // TOWN PARCELS (BORDERS) addTownParcelsLayer(map), // SEWER addSewerLayer(map), // STORIES addStoriesLayer(map), // OWNER LOCATION addOwnerLocationLayer(map), // INTERSECTION addIntersectionLayer(map), // PARCEL HIGHLIGHT addParcelHighlightLayer(map), ] // TOGGLE BUTTONS let toggleableLayerIds = [ "satellite", "parcels", "parcel highlight", "contours", "agis", "historic", "floodplain", "acec", "DEP wetland", "priority habitat", "estimated habitat", "vernal pools", "zone II", "soils", "conservancy districts", "zoning", "conservation", "sewer", "stories", "intersection", "towns", ] for (let i = 0; i < toggleableLayerIds.length; i++) { let id = toggleableLayerIds[i] let link = document.createElement("a") link.href = "#" link.className = "" link.textContent = id link.onclick = function (e) { let clickedLayer = this.textContent e.preventDefault() e.stopPropagation() let visibility = map.getLayoutProperty(clickedLayer, "visibility") // toggle layer visibility by changing the layout object's visibility property if (visibility === "visible") { map.setLayoutProperty(clickedLayer, "visibility", "none") this.className = "" } else { this.className = "active" map.setLayoutProperty(clickedLayer, "visibility", "visible") } let satelliteVisibility = map.getLayoutProperty("satellite", "visibility") map.moveLayer("satellite", "floodplain") map.moveLayer("satellite", "LiMWA") map.moveLayer("satellite", "contours") map.moveLayer("parcels", "satellite") // Toggle the visibility of LiMWA based on floodplain status let floodplainVisibility = map.getLayoutProperty("floodplain", "visibility") if (floodplainVisibility === "visible") { map.setLayoutProperty("LiMWA", "visibility", "visible") } else { map.setLayoutProperty("LiMWA", "visibility", "none") } let wetlandVisibility = map.getLayoutProperty("DEP wetland", "visibility") if (wetlandVisibility === "visible") { map.setLayoutProperty("DEP wetland line", "visibility", "visible") } else { map.setLayoutProperty("DEP wetland line", "visibility", "none") } } let layers = document.getElementById("menu") layers.appendChild(link) } // MAP SCALE map.addControl( new mapboxgl.ScaleControl({ maxWidth: 200, unit: "imperial", }), "bottom-right" ) map.addControl( new MapboxGeocoder({ accessToken: mapboxgl.accessToken, mapboxgl: mapboxgl, }) ) // PRINT FUNCTION var PrintElements = (function () { "use strict" var hideFromPrintClass = "pe-no-print" var preservePrintClass = "pe-preserve-print" var preserveAncestorClass = "pe-preserve-ancestor" var bodyElementName = "BODY" var _hide = function (element) { if (!element.classList.contains(preservePrintClass)) { element.classList.add(hideFromPrintClass) } } var _preserve = function (element, isStartingElement) { element.classList.remove(hideFromPrintClass) element.classList.add(preservePrintClass) if (!isStartingElement) { element.classList.add(preserveAncestorClass) } } var _clean = function (element) { element.classList.remove(hideFromPrintClass) element.classList.remove(preservePrintClass) element.classList.remove(preserveAncestorClass) } var _walkSiblings = function (element, callback) { var sibling = element.previousElementSibling while (sibling) { callback(sibling) sibling = sibling.previousElementSibling } sibling = element.nextElementSibling while (sibling) { callback(sibling) sibling = sibling.nextElementSibling } } var _attachPrintClasses = function (element, isStartingElement) { _preserve(element, isStartingElement) _walkSiblings(element, _hide) } var _cleanup = function (element, isStartingElement) { _clean(element) _walkSiblings(element, _clean) } var _walkTree = function (element, callback) { var currentElement = element callback(currentElement, true) currentElement = currentElement.parentElement while (currentElement && currentElement.nodeName !== bodyElementName) { callback(currentElement, false) currentElement = currentElement.parentElement } } var _print = function (elements) { for (var i = 0; i < elements.length; i++) { _walkTree(elements[i], _attachPrintClasses) } window.print() for (i = 0; i < elements.length; i++) { _walkTree(elements[i], _cleanup) } } return { print: _print, } })() const printButton = document.getElementById("btn") printButton.addEventListener("click", function () { const elementToPrint = document.getElementById("map") PrintElements.print([elementToPrint]) }) // NAVBAR // Function to build the navbar with dropdown menus function buildNavbar() { // Array of column names and dropdown items const columnNames = [ "Column 1", "Column 2", "Column 3", "Column 4", "Column 5", ] const dropdownItems = [ ["Dropdown Item 1", "Dropdown Item 2", "Dropdown Item 3"], ["Dropdown Item 4", "Dropdown Item 5", "Dropdown Item 6"], ["Dropdown Item 7", "Dropdown Item 8", "Dropdown Item 9"], ["Dropdown Item 10", "Dropdown Item 11", "Dropdown Item 12"], ["Dropdown Item 13", "Dropdown Item 14", "Dropdown Item 15"], ] // Get the navbar element const navbar = document.getElementById("navbar") // Loop through the column names to create navbar items columnNames.forEach((columnName, index) => { // Create a new navbar item const navbarItem = document.createElement("div") navbarItem.classList.add("navbar-item") // Create the column title const title = document.createElement("div") title.textContent = columnName title.classList.add("column-title") navbarItem.appendChild(title) // Create the dropdown menu const dropdown = document.createElement("div") dropdown.classList.add("dropdown") // Create the dropdown button const dropdownButton = document.createElement("button") dropdownButton.textContent = "▼" // Unicode down arrow dropdownButton.classList.add("dropdown-button") dropdown.appendChild(dropdownButton) // Create the dropdown content const dropdownContent = document.createElement("div") dropdownContent.classList.add("dropdown-content") // Add dropdown items to the dropdown content dropdownItems[index].forEach((dropdownItem) => { const item = document.createElement("a") item.href = "#" item.textContent = dropdownItem dropdownContent.appendChild(item) }) // Append dropdown content to the dropdown menu dropdown.appendChild(dropdownContent) // Append the dropdown menu to the navbar item navbarItem.appendChild(dropdown) // Append the navbar item to the navbar navbar.appendChild(navbarItem) }) } // Call the buildNavbar function buildNavbar()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <link rel="stylesheet" href="./styles.css" /> <!-- MAPBOX API--> <link href="https://api.mapbox.com/mapbox-gl-js/v3.2.0/mapbox-gl.css" rel="stylesheet" /> <script src="https://api.mapbox.com/mapbox-gl-js/v3.2.0/mapbox-gl.js"></script> <script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.5.1/mapbox-gl-geocoder.min.js"></script> <link rel="stylesheet" href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.5.1/mapbox-gl-geocoder.css" type="text/css" /> <!-- MAPBOX API END --> </head> <body> <nav id="menu"></nav> <!--HTML appended in JS--> <nav id="navbar"></nav> <!-- HTML appended in JS --> <div id="map"></div> <!--HTML appended in JS--> <button id="btn">Print</button> <script type="module" src="./app.js"></script> </body> </html>