var map = L.map('map').setView([55.68, 12.57], 13); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap' }).addTo(map); let known_store_chains; let icons = {}; var markers = L.featureGroup().addTo(map); var polygons = L.featureGroup().addTo(map); var heatmap = L.featureGroup().addTo(map); const CategoryField = document.getElementById('Category'); const LoadingIndicator = document.getElementById('LoadingIndicator'); const DefaultSearchValue = "supermarket"; var Categories = [] var overlayMaps = { "POI markers": markers, "Nearest POI polygons": polygons, // "POI heatmap": heatmap }; var layerControl = L.control.layers({},overlayMaps).addTo(map); function runQueryAfterLoad() { LoadingIndicator.hidden = false; fetchAll(CategoryField.value); } async function fetchCategories() { const response = await fetch("categories.json"); try { categories = await response.json(); const CategoriesDataList = document.getElementById('CategoriesDataList'); categories.forEach(function(item){ var option = document.createElement('option'); option.value = item; option.innerHTML = item; CategoriesDataList.appendChild(option); }); CategoryField.pattern = categories.join('|'); } catch (error) { alert(`Failed to fetch categories, are you online?\n${error.message}`) } } async function fetchChains() { const response = await fetch("chains.json"); known_store_chains = await response.json(); icons["Unknown"] = L.icon({ iconUrl: 'icons/Unknown.png', iconSize: [10, 16], iconAnchor: [5, 8], }); for (let known_store_chain in known_store_chains) { icons[known_store_chain] = L.icon({ iconUrl: `icons/${known_store_chain}.png`, iconAnchor: [8, 8], }); } const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const urlParam = urlParams.get('Category') const fieldValue = CategoryField.value // Retains saved value from input field on reload if (urlParam) { fetchAll(urlParam); CategoryField.value = urlParam; } else if (fieldValue !== "") { fetchAll(fieldValue); } else { CategoryField.value = DefaultSearchValue; fetchAll(DefaultSearchValue); } } function addPolygon(store) { let color; if (known_store_chains.hasOwnProperty(store.brand)) { color = known_store_chains[store.brand]; } else { color = 'grey'; } L.polygon(store.polygon, {color: color}).addTo(polygons); } function addShop(shop) { let icon; if (known_store_chains.hasOwnProperty(shop.brand)){ icon = icons[shop.brand]; } else { icon = icons["Unknown"]; } L.marker([shop.lat, shop.long], { title: shop.name, icon: icon, }).addTo(markers); addPolygon(shop) } async function fetchAll(Category) { const response = await fetch(`all.json?Category=${Category}`) const shops = await response.json(); shops.forEach((shop) => addShop(shop)); LoadingIndicator.hidden = true; } async function fetchShopHeatmap() { const response = await fetch("stores.json"); const shops = await response.json(); var heat = L.heatLayer(shops, {radius: 30}).addTo(heatmap); } fetchChains(); fetchCategories(); //fetchShopHeatmap();