window.AcrossNorwayGPXReady = (async function () { function loadCSS(href) { const exists = Array.from( document.querySelectorAll('link[rel="stylesheet"]') ) .some(link => link.href === href); if (exists) { return; } const link = document.createElement("link"); link.rel = "stylesheet"; link.href = href; document.head.appendChild( link ); } function loadScript( src, isReady ) { return new Promise( (resolve, reject) => { if (isReady()) { resolve(); return; } const existing = Array.from( document.scripts ) .find( script => script.src === src ); if (existing) { existing.addEventListener( "load", resolve, { once: true } ); existing.addEventListener( "error", reject, { once: true } ); return; } const script = document.createElement( "script" ); script.src = src; script.async = true; script.onload = resolve; script.onerror = reject; document.head.appendChild( script ); } ); } /* Leaflet */ loadCSS( "https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" ); /* Leaflet Fullscreen */ loadCSS( "https://unpkg.com/leaflet.fullscreen@5.3.3/dist/Control.FullScreen.css" ); await loadScript( "https://unpkg.com/leaflet@1.9.4/dist/leaflet.js", function () { return ( typeof window.L !== "undefined" ); } ); await loadScript( "https://unpkg.com/leaflet.fullscreen@5.3.3/dist/Control.FullScreen.umd.js", function () { return !!( window.L && L.Control && L.Control.FullScreen ); } ); /* Chart.js */ await loadScript( "https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js", function () { return ( typeof window.Chart !== "undefined" ); } ); return true; })();
Torsetlia Fjellstue og Hyttegrend

Torsetlia Fjellstue og Hyttegrend

Fjelleventyret venter på Torsetlia

Opplev ekte fjellkos og raus service på Torsetlia Fjellstue og Hyttegrend, som ligger 1 040 meter over havet på Dagalifjell, øverst i Numedal. Her tilbys overnatting i sjarmerende hytter – med eller uten utendørs boblebad – rom, studioleiligheter og leiligheter, til sammen rundt 100 sengeplasser.

Trivelig overnatting i særpregede boliger

Hyttene, inkludert de større hyttene med boblebad, gir en hjemmekoselig ramme rundt oppholdet. De ulike leilighetstypene og rommene gir fleksible valgmuligheter, enten du reiser alene, med familie eller i mindre grupper. Interiøret preges av varme tretoner, komfortable senger og intime oppholdsrom.

Fasiliteter og aktivitetstilbud for alle

Fjellstua kan skilte med peisestue, spisesal, god mat, bar med alle rettigheter, badstu, bordtennisrom, lekerom, piano og møterom. Her tilbys kortreist mat inspirert av Hardangervidda. Plassen er et perfekt utgangspunk for turer på vidda og ligger rett i langrennssporet og nært alpinanlegg, kretsløp for sykling, fiske og turstier – året rundt.

Vertskapet, med over 40 års erfaring, leverer personlig service og hjelper til med skreddersydde opplevelser – enten det er firmatur, familiehelg eller idrettssamling. Torsetlia er med andre ord perfekt for deg som ønsker helårskos med godt vertskap og spennende aktivitetstilbud.

Location

Information
Åpent for utleie av overnatting hele året.
Parking
Gratis parkering for gjester

Reviews

No reviews yet

Similar listings in category

(async function () { /* ========================================================= ACROSSNORWAY GPX v1 Directify + Kartverket + GPX + elevation profile ========================================================= */ try { if ( window.AcrossNorwayGPXReady ) { await window .AcrossNorwayGPXReady; } } catch (error) { console.error( "AcrossNorway GPX: Libraries could not be loaded", error ); return; } /* ========================================================= LANGUAGE ========================================================= */ const htmlLang = ( document.documentElement.lang || "en" ).toLowerCase(); const norwegian = htmlLang.startsWith("no") || htmlLang.startsWith("nb") || htmlLang.startsWith("nn"); const labels = norwegian ? { distance: "Lengde", ascent: "Stigning", highest: "Høyeste punkt", lowest: "Laveste punkt", profile: "Høydeprofil", distanceAxis: "Distanse (km)", elevationAxis: "Høyde (m)", start: "Start", end: "Slutt", fullscreen: "Vis kart i fullskjerm", fullscreenExit: "Avslutt fullskjerm", elevationUnit: "moh" } : { distance: "Distance", ascent: "Ascent", highest: "Highest point", lowest: "Lowest point", profile: "Elevation profile", distanceAxis: "Distance (km)", elevationAxis: "Elevation (m)", start: "Start", end: "Finish", fullscreen: "View map fullscreen", fullscreenExit: "Exit fullscreen", elevationUnit: "m a.s.l." }; /* ========================================================= DISTANCE CALCULATION ========================================================= */ function haversine( lat1, lon1, lat2, lon2 ) { const R = 6371; const rad = value => value * Math.PI / 180; const dLat = rad( lat2 - lat1 ); const dLon = rad( lon2 - lon1 ); const a = Math.sin( dLat / 2 ) ** 2 + Math.cos( rad(lat1) ) * Math.cos( rad(lat2) ) * Math.sin( dLon / 2 ) ** 2; return ( R * 2 * Math.atan2( Math.sqrt(a), Math.sqrt(1 - a) ) ); } function formatKm( value ) { let result = value.toFixed(1); if (norwegian) { result = result.replace( ".", "," ); } return result; } /* ========================================================= REDUCE CHART POINTS ========================================================= */ function sampleData( data, maxPoints = 1200 ) { if ( data.length <= maxPoints ) { return data; } const step = Math.ceil( data.length / maxPoints ); return data.filter( (item, index) => index % step === 0 || index === data.length - 1 ); } /* ========================================================= FIND GPX LINKS ========================================================= */ function getGPXLinks() { return Array .from( document.querySelectorAll( 'a[href]' ) ) .filter( link => { try { const url = new URL( link.href, window.location.href ); return ( url.pathname .toLowerCase() .endsWith( ".gpx" ) ); } catch { return false; } } ); } /* ========================================================= CREATE GPX WIDGET ========================================================= */ async function buildWidget( link, index ) { if ( link.dataset .anGpxProcessed === "1" || link.dataset .anGpxBusy === "1" ) { return; } link.dataset .anGpxBusy = "1"; const gpxUrl = link.href; const unique = Date.now() + "-" + index + "-" + Math.random() .toString(36) .slice(2, 7); const mapId = "an-gpx-map-" + unique; const statsId = "an-gpx-stats-" + unique; const chartId = "an-gpx-chart-" + unique; const profileId = "an-gpx-profile-" + unique; const widget = document.createElement( "section" ); widget.className = "an-gpx-widget"; widget.innerHTML = `
${labels.profile}

The GPX track is for guidance only and may contain errors. Use at your own risk.
– Always check maps, weather and conditions before your hike.

`; /* Widget is inserted directly before Directify's existing Download File button */ if ( !link.parentNode ) { delete link.dataset .anGpxBusy; return; } link.parentNode .insertBefore( widget, link ); try { /* ===================================================== LOAD GPX ===================================================== */ const response = await fetch( gpxUrl, { credentials: "omit" } ); if ( !response.ok ) { throw new Error( "GPX could not be loaded. HTTP " + response.status ); } const text = await response.text(); const xml = new DOMParser() .parseFromString( text, "application/xml" ); if ( xml.querySelector( "parsererror" ) ) { throw new Error( "Invalid GPX/XML" ); } /* ===================================================== TRACK SEGMENTS ===================================================== */ const trackSegments = Array.from( xml.getElementsByTagName( "trkseg" ) ); let segments = []; trackSegments.forEach( segment => { const segmentPoints = []; const nodes = Array.from( segment .getElementsByTagName( "trkpt" ) ); nodes.forEach( node => { const lat = parseFloat( node.getAttribute( "lat" ) ); const lon = parseFloat( node.getAttribute( "lon" ) ); const eleNode = node .getElementsByTagName( "ele" )[0]; const ele = eleNode ? parseFloat( eleNode .textContent ) : null; if ( Number.isFinite( lat ) && Number.isFinite( lon ) ) { segmentPoints .push({ lat: lat, lon: lon, ele: Number.isFinite( ele ) ? ele : null }); } } ); if ( segmentPoints .length ) { segments.push( segmentPoints ); } } ); /* ===================================================== FALLBACK FOR GPX ROUTES ===================================================== */ if ( !segments.length ) { const nodes = Array.from( xml.getElementsByTagName( "rtept" ) ); const routePoints = []; nodes.forEach( node => { const lat = parseFloat( node.getAttribute( "lat" ) ); const lon = parseFloat( node.getAttribute( "lon" ) ); const eleNode = node .getElementsByTagName( "ele" )[0]; const ele = eleNode ? parseFloat( eleNode .textContent ) : null; if ( Number.isFinite( lat ) && Number.isFinite( lon ) ) { routePoints .push({ lat: lat, lon: lon, ele: Number.isFinite( ele ) ? ele : null }); } } ); if ( routePoints .length ) { segments.push( routePoints ); } } if ( !segments.length ) { throw new Error( "No GPX track points found" ); } /* ===================================================== STATISTICS + ELEVATION ===================================================== */ let totalDistance = 0; let ascent = 0; let minElevation = Infinity; let maxElevation = -Infinity; const elevationData = []; segments.forEach( segment => { segment.forEach( (current, i) => { if ( i > 0 ) { const previous = segment[ i - 1 ]; totalDistance += haversine( previous.lat, previous.lon, current.lat, current.lon ); if ( current.ele !== null && previous.ele !== null ) { const diff = current.ele - previous.ele; if ( diff > 0 ) { ascent += diff; } } } if ( current.ele !== null ) { minElevation = Math.min( minElevation, current.ele ); maxElevation = Math.max( maxElevation, current.ele ); elevationData .push({ x: totalDistance, y: current.ele, lat: current.lat, lon: current.lon }); } } ); } ); /* ===================================================== MAP ===================================================== */ const map = L.map( mapId, { scrollWheelZoom: true, preferCanvas: false } ); /* ===================================================== KARTVERKET ===================================================== */ L.tileLayer( "https://cache.kartverket.no/v1/wmts/1.0.0/topo/default/webmercator/{z}/{y}/{x}.png", { maxZoom: 18, attribution: '© Kartverket' } ).addTo( map ); /* ===================================================== FULLSCREEN ===================================================== */ if ( L.Control && L.Control.FullScreen ) { new L.Control .FullScreen({ position: "topleft", title: labels .fullscreen, titleCancel: labels .fullscreenExit, forceSeparateButton: true }) .addTo( map ); map.on( "enterFullscreen", function () { setTimeout( function () { map.invalidateSize(); }, 150 ); } ); map.on( "exitFullscreen", function () { setTimeout( function () { map.invalidateSize(); }, 150 ); } ); } /* ===================================================== ROUTE PANE ===================================================== */ map.createPane( "acrossNorwayRoute" ); map.getPane( "acrossNorwayRoute" ) .style .zIndex = "650"; const routeRenderer = L.svg({ pane: "acrossNorwayRoute", padding: 0.5 }); routeRenderer.addTo( map ); const routeGroup = L.featureGroup() .addTo( map ); /* ===================================================== GPX TRACK ===================================================== */ segments.forEach( segment => { const latLngs = segment.map( point => [ point.lat, point.lon ] ); if ( latLngs.length < 2 ) { return; } /* White outline */ L.polyline( latLngs, { renderer: routeRenderer, pane: "acrossNorwayRoute", className: "an-route-outline", color: "#ffffff", weight: 7, opacity: 1, interactive: false, smoothFactor: 0 } ).addTo( routeGroup ); /* Red route */ L.polyline( latLngs, { renderer: routeRenderer, pane: "acrossNorwayRoute", className: "an-route", color: "#e31b23", weight: 4, opacity: 1, interactive: false, smoothFactor: 0 } ).addTo( routeGroup ); } ); /* ===================================================== START / FINISH ===================================================== */ const first = segments[0][0]; const lastSegment = segments[ segments.length - 1 ]; const last = lastSegment[ lastSegment.length - 1 ]; const startIcon = L.divIcon({ className: "", html: '
', iconSize: [16, 16], iconAnchor: [8, 8] }); const endIcon = L.divIcon({ className: "", html: '
', iconSize: [16, 16], iconAnchor: [8, 8] }); L.marker( [ first.lat, first.lon ], { icon: startIcon } ) .addTo( map ) .bindTooltip( labels.start ); L.marker( [ last.lat, last.lon ], { icon: endIcon } ) .addTo( map ) .bindTooltip( labels.end ); /* ===================================================== ELEVATION HOVER MARKER ===================================================== */ const hoverIcon = L.divIcon({ className: "", html: '
', iconSize: [18, 18], iconAnchor: [9, 9] }); const hoverMarker = L.marker( [ first.lat, first.lon ], { icon: hoverIcon, interactive: false, zIndexOffset: 1000 } ); let hoverMarkerVisible = false; /* ===================================================== FIT MAP ===================================================== */ const bounds = routeGroup .getBounds(); if ( bounds.isValid() ) { map.fitBounds( bounds, { padding: [30, 30], maxZoom: 14 } ); } /* ===================================================== STATISTICS ===================================================== */ document .getElementById( statsId ) .innerHTML = `
${formatKm(totalDistance)} km ${labels.distance}
${Math.round(ascent)} m ${labels.ascent}
${ Number.isFinite( maxElevation ) ? Math.round( maxElevation ) + " " + labels .elevationUnit : "–" } ${labels.highest}
${ Number.isFinite( minElevation ) ? Math.round( minElevation ) + " " + labels .elevationUnit : "–" } ${labels.lowest}
`; /* ===================================================== ELEVATION PROFILE ===================================================== */ if ( elevationData.length > 1 ) { const chartData = sampleData( elevationData ); const canvas = document .getElementById( chartId ); new Chart( canvas.getContext( "2d" ), { type: "line", data: { datasets: [{ data: chartData, parsing: false, borderColor: "#e31b23", backgroundColor: "rgba(227,27,35,.13)", borderWidth: 2, pointRadius: 0, pointHoverRadius: 5, pointHitRadius: 15, fill: true, tension: 0.12 }] }, options: { responsive: true, maintainAspectRatio: false, animation: false, interaction: { mode: "nearest", intersect: false, axis: "x" }, onHover: function ( event, activeElements, chart ) { if ( !activeElements .length ) { return; } const pointIndex = activeElements[0] .index; const point = chart .data .datasets[0] .data[ pointIndex ]; if ( !point || !Number.isFinite( point.lat ) || !Number.isFinite( point.lon ) ) { return; } hoverMarker .setLatLng( [ point.lat, point.lon ] ); if ( !hoverMarkerVisible ) { hoverMarker .addTo( map ); hoverMarkerVisible = true; } }, plugins: { legend: { display: false }, tooltip: { displayColors: false, callbacks: { title: function ( items ) { if ( !items.length ) { return ""; } let value = items[0] .parsed .x .toFixed( 1 ); if ( norwegian ) { value = value.replace( ".", "," ); } return ( value + " km" ); }, label: function ( context ) { return ( Math.round( context .parsed .y ) + " " + labels .elevationUnit ); } } } }, scales: { x: { type: "linear", beginAtZero: true, title: { display: true, text: labels .distanceAxis } }, y: { title: { display: true, text: labels .elevationAxis } } } } } ); canvas.addEventListener( "mouseleave", function () { if ( hoverMarkerVisible ) { map.removeLayer( hoverMarker ); hoverMarkerVisible = false; } } ); } else { document .getElementById( profileId ) .style .display = "none"; } /* ===================================================== IMPORTANT: WE DO NOT HIDE DIRECTIFY'S DOWNLOAD FILE LINK ===================================================== */ link.dataset .anGpxProcessed = "1"; delete link.dataset .anGpxBusy; /* ===================================================== REFLOW ===================================================== */ setTimeout( function () { map.invalidateSize(); if ( bounds.isValid() ) { map.fitBounds( bounds, { padding: [30, 30], maxZoom: 14 } ); } }, 400 ); } catch (error) { console.error( "AcrossNorway GPX:", error ); /* GPX widget removed if something fails. Directify Download File remains untouched. */ widget.remove(); delete link.dataset .anGpxBusy; } } /* ========================================================= INITIALIZE ========================================================= */ async function initAcrossNorwayGPX() { const links = getGPXLinks(); for ( let i = 0; i < links.length; i++ ) { await buildWidget( links[i], i ); } } if ( document.readyState === "loading" ) { document.addEventListener( "DOMContentLoaded", initAcrossNorwayGPX, { once: true } ); } else { initAcrossNorwayGPX(); } /* Directify may render some fields slightly later */ setTimeout( initAcrossNorwayGPX, 1200 ); })();