/**
* Leaflet-karta
* @type {L.Map}
* */
let map;
/**
* Sökfält för plats
* @type {HTMLInputElement}
* */
let searchPlace;
/**
* Skapar kartan från Leaflet och triggar nästa funktion
*/
function createMap() {
map = L.map('map').setView([59.33, 18.064], 14);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
}).addTo(map);
getSearch();
}
/**
* Skapar sökfunktion och tar värdet därifrån, skickar vidare
*/
function getSearch() {
searchPlace = document.getElementById("search");
const button = document.getElementById("searchButton");
button.addEventListener("click", () => {
const searchValue = searchPlace.value;
const bigLetterValue = searchValue.toUpperCase();
mapPlace(bigLetterValue);
});
}
/**
* fetchar platsinfo API utifrån sök-value som skickas hit
* @param {string} bigLetterValue - sökvärdet (med stor bokstav)
*/
async function mapPlace(bigLetterValue) {
const link = `https://nominatim.openstreetmap.org/search?q=${bigLetterValue}&format=json`;
try {
const linkInfo = await fetch(link);
const jsonInfo = await linkInfo.json();
mapSearch(jsonInfo);
}
catch (error) {
searchPlace = document.getElementById("search");
const errorPlacement = document.getElementById("errorPlacement");
errorPlacement.innerHTML = "Verkar som det blev något fel, prova igen :)";
searchPlace.addEventListener("input", () => {
errorPlacement.innerHTML = "";
});
}
}
/**
* Tar emot platsinfo från API
* och skapar arrayer med
* latitud samt longitud
* @param {Array<Object>} jsonInfo - array med platsobjekt från API
*/
function mapSearch(jsonInfo) {
const latitudes = [];
const longitudes = [];
jsonInfo.forEach(element => {
const latitude = element.lat;
const longitude = element.lon;
latitudes.push(latitude);
longitudes.push(longitude);
});
createMarker(latitudes, longitudes);
}
/**
* Skapar markör på karta med första koordinaterna
* i arrayerna +
* skriver ut koordinater på skärmen
* @param {Array<number>} latitudes
* @param {Array<number>} longitudes
*/
function createMarker(latitudes, longitudes) {
const lat = parseFloat(latitudes[0]);
const lon = parseFloat(longitudes[0]);
L.marker([lat, lon]).addTo(map);
map.setView([lat, lon], 14);
const cordPlace = document.getElementById("coordinates");
cordPlace.innerHTML = `<p>Latitud: ${lat}, Longitud: ${lon} </p>`;
}