{"id":3614,"date":"2026-06-16T21:17:48","date_gmt":"2026-06-16T21:17:48","guid":{"rendered":"https:\/\/profesorynamotory.eu\/?page_id=3614"},"modified":"2026-08-31T05:57:32","modified_gmt":"2026-08-31T05:57:32","slug":"robert","status":"publish","type":"page","link":"https:\/\/profesorynamotory.eu\/index.php\/robert\/","title":{"rendered":"Trasy Roberta"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3614\" class=\"elementor elementor-3614\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f3d06b3 e-flex e-con-boxed e-con e-parent\" data-id=\"f3d06b3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0cd6647 elementor-widget elementor-widget-heading\" data-id=\"0cd6647\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">moje trasy<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-35f3da1 elementor-widget elementor-widget-text-editor\" data-id=\"35f3da1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>o ma\u0142ych i du\u017cych wycieczkach<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0cd8eaa e-con-full e-flex e-con e-parent\" data-id=\"0cd8eaa\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b3ec9ad elementor-widget__width-inherit elementor-widget elementor-widget-heading\" data-id=\"b3ec9ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Co tu znajdziesz<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab1ba8a elementor-widget__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"ab1ba8a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>To strona z dokumentacj\u0105 moich wycieczek motocyklowych (r\u00f3wnie\u017c tych ma\u0142ych, jednodniowych). Znajduj\u0105 si\u0119 tu wi\u0119c moje samotne wyjazdy 'wok\u00f3\u0142 komina&#8217;, do znajomych czy ma\u0142e wycieczki motocyklowe.<\/p>\n<p>To bardziej dokumentacja dla mnie, ni\u017c strona dla Ciebie.<\/p><p><br><\/p>\n<p><a href=\"https:\/\/profesorynamotory.eu\/moje_html\/interactive_gpx_and_photo_map_v8.html\" target=\"_blank\" style=\"background-color: rgb(255, 255, 255);\">Mapa GPX + zdj\u0119cia<\/a>&nbsp;&#8211; strona umo\u017cliwiaj\u0105ca wczytanie zdj\u0119\u0107 i \u015bladu GPX dzi\u0119ki czemu mo\u017cesz je wy\u015bwietli\u0107 na jednej stronie i przegl\u0105da\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-049d364 e-con-full e-flex e-con e-parent\" data-id=\"049d364\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f342955 elementor-widget elementor-widget-html\" data-id=\"f342955\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"pl\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Trasy Motocyklowe - Profesory na Motory<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n    <style>\n        #map { height: 60vh; width: 100%; border-radius: 0.5rem; z-index: 1; }\n        @media (min-width: 768px) { #map { height: 75vh; } }\n    <\/style>\n<\/head>\n<body class=\"bg-gray-100 text-gray-800 font-sans antialiased\">\n\n    <div class=\"max-w-[1800px] mx-auto px-4 sm:px-6 lg:px-8 py-8\">\n        <header class=\"mb-8\">\n            <h1 class=\"text-3xl font-bold text-gray-900 border-b-4 border-orange-500 inline-block pb-2\">Moje Trasy Motocyklowe<\/h1>\n        <\/header>\n\n        <div class=\"flex flex-col md:flex-row gap-6\">\n            <div class=\"w-full md:w-1\/3 lg:w-1\/4 bg-white rounded-lg shadow-md p-5 flex flex-col h-fit\">\n                <div class=\"mb-5\">\n                    <label class=\"block text-sm font-medium text-gray-700 mb-2\">Wybierz sezon (Rok)<\/label>\n                    <select id=\"yearSelect\" class=\"w-full p-2.5 border rounded-lg\">\n                        <option value=\"\">-- Wybierz rok --<\/option>\n                        <option value=\"all\">Wszystkie<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"mb-5\">\n                    <label class=\"block text-sm font-medium text-gray-700 mb-2\">Dost\u0119pne trasy<\/label>\n                    <select id=\"routeSelect\" class=\"w-full p-2.5 border rounded-lg\" disabled>\n                        <option value=\"\">Najpierw wybierz rok<\/option>\n                    <\/select>\n                <\/div>\n                <!-- Panel sumaryczny -->\n                <div id=\"summaryPanel\" class=\"mt-4 pt-4 border-t border-gray-200 hidden\">\n                    <p class=\"text-sm text-gray-600\">\u0141\u0105czny dystans:<\/p>\n                    <p class=\"text-2xl font-bold text-orange-600 mb-2\" id=\"totalDistance\">0 km<\/p>\n                    <p class=\"text-sm text-gray-600\">\u0141\u0105czny czas jazdy:<\/p>\n                    <p class=\"text-2xl font-bold text-orange-600\" id=\"totalTime\">0h 0m<\/p>\n                    <p id=\"timeWarning\" class=\"text-xs text-red-500 mt-2 hidden italic\">* Cz\u0119\u015b\u0107 tras nie posiada danych o czasie.<\/p>\n                <\/div>\n            <\/div>\n            <div class=\"w-full md:w-2\/3 lg:w-3\/4 bg-white rounded-lg shadow-md p-2\">\n                <div id=\"map\"><\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet-gpx\/1.7.0\/gpx.min.js\"><\/script>\n\n    <script>\n        let routesData = {};\n        let map;\n        let currentLayers;\n        let totalDistance = 0;\n        let totalTimeMs = 0;\n        let missingTimeData = false;\n\n        document.addEventListener('DOMContentLoaded', () => {\n            map = L.map('map').setView([52.069, 19.480], 6);\n            L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png').addTo(map);\n            currentLayers = L.featureGroup().addTo(map);\n            loadDynamicDataFromServer();\n        });\n\n        async function loadDynamicDataFromServer() {\n            try {\n                const response = await fetch('\/get_routes.php');\n                routesData = await response.json();\n                const yearSelect = document.getElementById('yearSelect');\n                Object.keys(routesData).sort((a,b) => b-a).forEach(year => {\n                    const opt = document.createElement('option');\n                    opt.value = year; opt.textContent = year;\n                    yearSelect.appendChild(opt);\n                });\n            } catch(e) { console.error(\"B\u0142\u0105d \u0142adowania danych:\", e); }\n        }\n\n        document.getElementById('yearSelect').addEventListener('change', function() {\n            const routeSelect = document.getElementById('routeSelect');\n            routeSelect.innerHTML = '<option value=\"\">-- Wybierz tras\u0119 --<\/option>';\n            document.getElementById('summaryPanel').classList.add('hidden');\n            \n            if(this.value) {\n                routeSelect.disabled = false;\n                const allOpt = document.createElement('option');\n                allOpt.value = 'all'; \n                allOpt.textContent = 'Wszystkie trasy z tego roku';\n                routeSelect.appendChild(allOpt);\n                \n                const targets = (this.value === 'all') ? Object.values(routesData).flat() : routesData[this.value];\n                targets.forEach(r => {\n                    const opt = document.createElement('option');\n                    opt.value = r.url; \n                    opt.textContent = r.name;\n                    routeSelect.appendChild(opt);\n                });\n            } else { \n                routeSelect.disabled = true; \n            }\n        });\n\n        document.getElementById('routeSelect').addEventListener('change', async function() {\n            currentLayers.clearLayers();\n            totalDistance = 0;\n            totalTimeMs = 0;\n            missingTimeData = false;\n            \n            document.getElementById('totalDistance').textContent = \"0 km\";\n            document.getElementById('totalTime').textContent = \"0h 0m\";\n            document.getElementById('timeWarning').classList.add('hidden');\n            document.getElementById('summaryPanel').classList.remove('hidden');\n            \n            let urls = (this.value === 'all') ? Array.from(this.options).filter(o => o.value !== 'all' && o.value !== '').map(o => o.value) : (this.value ? [this.value] : []);\n\n            for (const url of urls) {\n                await loadGPX(url);\n            }\n            \n            if (currentLayers.getLayers().length > 0) {\n                map.fitBounds(currentLayers.getBounds());\n            }\n        });\n\n        async function loadGPX(url) {\n            if (typeof L.GPX === 'undefined') {\n                await new Promise(resolve => {\n                    const s = document.createElement('script');\n                    s.src = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet-gpx\/1.7.0\/gpx.min.js';\n                    s.onload = resolve;\n                    document.head.appendChild(s);\n                });\n            }\n\n            new L.GPX(url, { \n                async: true, \n                marker_options: { startIconUrl: '', endIconUrl: '', shadowUrl: '' },\n                polyline_options: { color: '#f97316', weight: 5 } \n            }).on('loaded', e => {\n                currentLayers.addLayer(e.target);\n                \n                \/\/ Dystans\n                totalDistance += e.target.get_distance() \/ 1000;\n                document.getElementById('totalDistance').textContent = totalDistance.toFixed(1) + \" km\";\n\n                \/\/ Czas\n                const moveTime = e.target.get_moving_time();\n                if (moveTime > 0) {\n                    totalTimeMs += moveTime;\n                } else {\n                    missingTimeData = true;\n                    document.getElementById('timeWarning').classList.remove('hidden');\n                }\n                \n                const h = Math.floor(totalTimeMs \/ 3600000);\n                const m = Math.floor((totalTimeMs % 3600000) \/ 60000);\n                document.getElementById('totalTime').textContent = `${h}h ${m}m`;\n                \n            }).addTo(map);\n        }\n    <\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-10dbb5c e-con e-atomic-element e-flexbox-base e-52a0b43 \" data-id=\"10dbb5c\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"10dbb5c\">\n    \n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>moje trasy o ma\u0142ych i du\u017cych wycieczkach Co tu znajdziesz To strona z dokumentacj\u0105 moich wycieczek motocyklowych (r\u00f3wnie\u017c tych ma\u0142ych, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"folder":[23],"class_list":["post-3614","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/pages\/3614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/comments?post=3614"}],"version-history":[{"count":187,"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/pages\/3614\/revisions"}],"predecessor-version":[{"id":4169,"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/pages\/3614\/revisions\/4169"}],"wp:attachment":[{"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/media?parent=3614"}],"wp:term":[{"taxonomy":"folder","embeddable":true,"href":"https:\/\/profesorynamotory.eu\/index.php\/wp-json\/wp\/v2\/folder?post=3614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}